Я работаю над функцией для моей программы, которая читает имя и фамилию из текстового файла и сохраняет их в виде двух строк. Однако я не могу заставить оператор if (isspace (next)) выполняться, когда цикл for достигает первого пробела между именами и фамилиями.
Вот полная программа
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
#include <ctype.h>
using namespace std;
void calcAvg(ifstream& in, ofstream& out);
int main()
{
//open input and output file streams and check for any failures
ifstream input;
ofstream output;
input.open("lab08_in.txt");
output.open("lab08_out.txt");
if(input.fail())
{
cout << "Error: File not Found!" << endl;
exit(1);
}
if(output.fail())
{
cout << "Error: File creation failed!" << endl;
exit(1);
}
calcAvg(input, output);
return 0;
}
void calcAvg(ifstream& in, ofstream& out)
{
int sum = 0;
double average;
//save first and last name to strings
string firstname, lastname;
char next;
int i = 1;
in >> next;
for(; isalpha(next) && i < 3; in >> next)
{
if(i == 1)
{
firstname += next;
cout << next << " was added to firstname" << endl;
if(isspace(next))
{
cout << "Space!" << endl;
out << firstname << ' ';
i++;
}
}
else if(i == 2)
{
lastname += next;
cout << next << " was added to lastname" << endl;
if(isspace(next))
{
cout << "Space!" << endl;
out << lastname << ' ';
i++;
}
}
}
}
Часть кода, с которой у меня возникают проблемы,
if(isspace(next))
{
cout << "Space!" << endl;
out << firstname << ' ';
i++;
}
Код должен (на мой взгляд) прочитать каждый символ из файла и добавить к строке, и как только он достигнет пробела, написать эту строку имя в выходной файл, но это не так, вместо этого я получаю этот вывод в консоли
H was added to firstname
e was added to firstname
s was added to firstname
s was added to firstname
D was added to firstname
a was added to firstname
m was added to firstname
так далее…
Обратите внимание, как имя должно быть Гесс Дам …. и что должно произойти, это спасает Гесс имя и дам … чтобы Фамилия. Вместо этого это просто добавление целиком до вкладки после фамилии в имя строка и никогда не записывает в выходной файл. Он читает вкладку, потому что выходит из цикла for (из isalpha (next)), но по какой-то причине аргумент isspace (next) не работает
Извините, у меня нет репутации, чтобы комментировать, но есть два неправильных ответа. Комментарий от Захир прав. std :: isspace (c, is.getloc ()) имеет значение true для следующего символа c в is (этот пробельный символ остается во входном потоке). Оператор >> никогда не вернет пробелы.
Вы проверяете, если next
является альфа-символом в цикле for: for(; isalpha(next) && i < 3; in >> next)
,
Согласно документация, символ «пробел» не считается альфа-символом в локали C по умолчанию. Вы можете либо изменить свою локаль, чтобы обойти это, либо, более предпочтительно (на мой взгляд), изменить цикл for, чтобы также принимать пробелы.
Что-то вроде for(; (isalpha(next) || isspace(next)) && i < 3; in >> next)
должен позволить циклу обрабатывать пространство вместе с альфа-символами
РЕДАКТИРОВАТЬ: Как отметили несколько других, я упустил тот факт, что использование здесь оператора >> приведет к тому, что вы никогда не увидите пробелы, поэтому мой ответ не полный. Я собираюсь оставить это на всякий случай, если это все еще может оказаться полезным.
Ваша проблема не с isspace
функция, это с вашим for
петля, вы заставляете for
цикл для обработки только буквенных символов с помощью isalpha
в этом случае персонаж не может быть iscntrl
, isdigit
, ispunct
или же isspace
). Взгляни на этот.