fscanf() только чтение текста

avatar
Vasya Vasya
8 апреля 2018 в 09:18
74
1
-2

Я пытаюсь прочитать текстовый файл с помощью fscanf() со спецификатором %[]. Файл вроде этого:

qwety, qwe<

qwety,qwety.... qwety

Итак, мне нужно прочитать только текст без каких-либо разделителей, таких как запятая, пробел, точка.. Поиск ответа сказал что-то вроде этого, но он не работает должным образом: успешно читает только первое слово и переходит к бесконечному циклу

char buff[1024];
while(!feof){
    fscanf(file, "%[a-z]", buff);
    puts(buff);
}

Что мне делать, чтобы решить эту проблему?

Источник
David C. Rankin
8 апреля 2018 в 09:25
2

Вы захотите посмотреть на Почему while ( !feof (file) ) всегда неправильно?.

Vasya Vasya
8 апреля 2018 в 09:32
0

Нет, проблема только с fscanf(), потому что я всегда читаю только одно слово вместо пяти.

Ulrich Eckhardt
8 апреля 2018 в 10:01
0

while (!feof) никогда не будет зацикливаться. feof — это функция, которая в этом контексте превращается в указатель на функцию. У него никогда не бывает ложного значения (NULL), поэтому его отрицание всегда ложно. Может быть, это просто опечатка, но тогда это просто показывает, что вы должны были предоставить минимальный воспроизводимый пример.

Ответы (1)

avatar
David C. Rankin
8 апреля 2018 в 09:34
1

Проблема в том, что после чтения первого слова в buff следующие символы в файле (ваш входной буфер) не являются a-z, поэтому все последующие вызовы fscanf заканчиваются неудачей с ошибкой сопоставления . Чтобы решить эту проблему, переверните класс символов и используйте оператор подавления присваивания ('*') для чтения и удаления любых символов, отличных от a-z, например <84631183>.

while (fscanf(file, "%1023[a-z]%*[^a-z]", buff) == 1)
    puts(buff);

chux - Reinstate Monica
8 апреля 2018 в 18:16
0

fscanf(file, "%1023[a-z]"... и fscanf(file, "%*[^a-z]".... должны быть разделены. Для этого ответа "%1023[a-z]%*[^a-z]" потребление небукв требует предварительного успешного чтения букв. Этот ответ ничего не печатает, если первый символ файла не является буквой.

David C. Rankin
8 апреля 2018 в 18:41
0

Что ж, замечание сделано, но я просто работал над заданным вопросом, а не над всем, что можно было задать. Если бы мы разделились и обусловили бы break первым, мы оказались бы в одной лодке. Теперь мы могли бы использовать getchar() и ungetc() в качестве начального теста, что облегчило бы проблему. fgets (или getline) с проверкой 1-го символа, за которой следует sscanf, также будет иметь больше смысла с точки зрения надежности.