Чтение символов из потока до пробела с использованием isspace в c - PullRequest
1 голос
/ 29 января 2010

Я пытаюсь написать функцию, которая принимает поток в качестве аргумента, читает из этого потока и считывает содержимое файла до первого пробела, как определено функцией isspace, а затем использует функцию strtok для разобрать строку. Я не уверен, как запустить его, хотя с какой функцией читать строку и игнорировать пробелы. Я знаю, что fgetc и getc читают только один символ за раз, и, глядя на ссылку fscanf, это сработает? Или это только найти элементы в вашем потоке в соответствии со спецификаторами формата% s? Спасибо!

Ответы [ 3 ]

2 голосов
/ 29 января 2010

Чтобы прочитать всю строку за раз, вы обычно должны использовать fgets.Необходима некоторая осторожность, если строка в потоке длиннее вашего буфера, остаток в потоке останется, что может оказаться не тем, что вы хотите.(Если вы хотите игнорировать оставшуюся часть строки, вы можете использовать fgets с последующим fscanf, как описано в http://home.datacomm.ch/t_wolf/tw/c/getting_input.html.)

Если вы хотите читать всю строку, не беспокоясь о размере буферавы можете захотеть взглянуть на функцию Чака Фальконера ggets , которая динамически распределяет буфер для вас (это означает, что вы несете ответственность за его освобождение).

1 голос
/ 29 января 2010

хорошо, хотя getc / fgetc получает только 1 символ за раз, вы можете поместить их в цикл, верно? :)

1 голос
/ 29 января 2010

C Ответ

Преобразование fscanf s будет соответствовать последовательности символов, не являющихся пробелами. Входная строка останавливается на пустом месте (как определено isspace) или на максимальной ширине поля, в зависимости от того, что произойдет раньше. Обратите внимание, что в предоставленном буфере должно быть достаточно места, или он может быть переполнен длинным вводом.

FILE *fp;
char cstr[128];

fp = fopen("test.txt", "r");

while (!feof(fp))
{    
    fscanf(fp, "%s", cstr);
    ...
}

Оригинальный ответ C

Функция fgets позволит вам читать в файле по одной строке за раз, но вам все равно придется проверять каждый символ с помощью isspace.

Поскольку isspace может включать пробел, подачу формы ('\ f'), символ новой строки ('\ n'), возврат каретки ('\ r'), горизонтальную табуляцию ('\ t') и вертикальную табуляцию ('\ v') при проверке пробелов, лучше всего читать цикл по одному символу за раз, используя функцию fgetc . Обратите внимание, что если целочисленное значение, возвращаемое fgetc () , сохраняется в переменной типа char и затем сравнивается с целочисленной константой EOF, сравнение никогда не будет успешным, поскольку расширение знака переменной типа char при расширении до целого определяется реализацией.

FILE *fp;
int c;

fp = fopen("test.txt", "r");
while ((c = fgetc(fp)) != EOF)
{
    if (isspace(c))
    {
        ...
    }
    else
    {
        ...
    }
}

Оригинальный ответ C ++

Метод istream :: getline позволит вам читать по одной строке за раз и при желании указывать разделитель (по умолчанию '/ n').

Так как isspace может включать пробел, подачу формы ('\ f'), символ новой строки ('\ n'), возврат каретки ('\ r'), горизонтальную табуляцию ('\ t') и вертикальную табуляцию ('\ v') при проверке пробелов, лучше всего читать цикл по одному символу за раз, используя метод istream :: get .

char c;
string str;
ifstream file("test.txt",ios::in);
while (file.get(c)) 
{
    if (isspace((unsigned char)c))
    {
        ...
    }
    else
    {
        str.push_back(c);
    }

    file.peek();
    if (file.eof())
    {
        break;
    }
}

Примечание: проверка ошибок была исключена из всего вышеприведенного кода для простоты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...