Не считывается последний символ строки из файла
Всем доброго времени суток. Задача для понимания смысла программы: напишите программный код для подсчёта числа цифр в данном файле и их суммы. Как показала отладка, проблема заключается лишь в строчке fin.getline(str, N);. Она считывает всю строку кроме последнего символа в этой строке, соответственно в массив записывается вся строка посимвольно кроме последнего символа. Следовательно если при пользовательском вводе последним символом окажется цифра, то она не учтется при подсчете потому что ее попросту не будет в массиве. Вопрос - каким образом/методом заставить программу считывать последний символ строки и записывать ее в массив?
Код прилагается:
#include <iostream>
#include <fstream>
#include <string.h>
#include <windows.h>
#include <conio.h>
#include <stdlib.h>
using namespace std;
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
/* Динамический массив нужен для записи в него строки из файла посимвольно
при последующем его открытии. */
int N;
char *str = new char[N];
int sum = 0;
int num = 0;
string s;
ofstream fout("file.txt");
cout << "Введите строку: " << endl;
getline(cin, s);
fout << s;
N = s.size();
fout.close();
ifstream fin("file.txt");
if (!fin)
{
cerr << "Ошибка." << endl;
return 1;
}
else
{
while(fin)
fin.getline(str, N); // на этом месте пропадает последний символ
for(int i = 0; i < N; i++)
{
if((str[i] >= '0') && (str[i] <= '9'))
{
sum += str[i] - '0';
num++;
}
}
}
cout << "Сумма цифр = " << sum << endl;
cout << "Кол-во цифр = " << num << endl;
fin.close();
delete [] str;
getch();
return 0;
}
Заранее спасибо за ответ. Критика приветствуется.
Ответы (1 шт):
После этого
int N;
char *str = new char[N];
нет никакого смысла говорить о любых дальнейших действиях в программе. Выделили непонятно сколько памяти, и хотите работать...
Эта фигня встречается уже не первый раз - тут что, тоже какой-то препод постарался? Считать, что если потом изменится N, то это автоматом приведет к изменению количества выделенной памяти?
Почему бы, кстати, если уж вы пишете строку string - не читать в такую же строку? getline(fin,s)? По крайней мере не пришлось бы с памятью напрямую возиться...
А последний символ пропадает, потому что вы сказали, что размер буфера для чтения - N, вот он и читает N-1 символ, а потом нулевой дописывает - строка все же. И об этом ясно написано в описании этой функции - https://en.cppreference.com/w/cpp/io/basic_istream/getline