Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

Как детектировать EOF с fgets/gets - C++

22.09.2013, 14:12. Просмотров 649. Ответов 4
Метки нет (Все метки)

Проблема в определении:
Файл1:
строка1
строка2
EOF


Файл2:
строка1
строка2EOF


Если пытаться пробегать fgets() и сразу проверять, встретился ли EOF, то при чтении второго файла будет потеряна последняя строка. Если проверять не после fgets(), то в первом файле будет якобы две "строка2".
Вижу два варианта решения: в начало файла добавить linesCount или хранить две строки: одна - прошлая, вторая - текущая и сравнивать их, если одинаковы при EOF - не выводить. Оба решения мне не подходят.

Посимвольное чтение не подходит. Только gets/fgets
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2013, 14:12
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как детектировать EOF с fgets/gets (C++):

Как детектировать присутствие пробела в строке? Regex - C++
пробовал по разному, всегда возвращает False std::regex_match(L"sd ", std::wregex(L"/()+/g")); // false std::regex_match(L"sd ",...

Как использовать getline и fgets? - C++
#include <iostream> #include <fstream> #include <string> using std::ofstream; using std::cout; using std::endl; using...

Как использовать функцию fgets? - C++
Люди прочитал тут про функцию fgets() но как то понять до конца не могу поясните плиз кто понимает и работал с ней уже... А нашел такую...

Как правильно работать с функциями gets() и fgets()? - C++
Подскажите, как правильно пользоваться ими? При использовании gets() компилятор выдает ошибку error: ‘gets’ was not declared in this scope ...

Как заменить функцию fgets на strlen и strcpy? - C++
while (fgets(s1, sz_line, fp)) //будет прочитано 120 символов { // считаем длину текущей строки , будет в j j = 0; while...

Fopen и fgets, не понимаю как с ними оперировать - C++
Получаю такую штуку как sentence из командной строки в виде C:\folder\name.txt, и хочу её вставить в fopen. Обычно пишут...

4
zer0mail
2447 / 2081 / 205
Регистрация: 03.07.2012
Сообщений: 7,559
Записей в блоге: 1
22.09.2013, 15:03 #2
Приведи пример программы, где получается "две строки".
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
22.09.2013, 15:17  [ТС] #3
В общем, решил проблему. fgets() возвращает NULL, если первый символ в строке - EOF и устанавливает флаг EOF, иначе указатель на считанную строку + устанавливает EOF (если в конце строки он). Так что проверить fgets() на NULL, если NULL, то break, иначе делаю ещё одну итерацию и выпрыгиваю из цикла с feof().
0
zer0mail
2447 / 2081 / 205
Регистрация: 03.07.2012
Сообщений: 7,559
Записей в блоге: 1
22.09.2013, 15:25 #4
Я обычно пишу примерно так:
C++
1
2
3
while (fgets(buf,100,file)) {
      i=strlen(buf); // в общем, обрабатываю строку
}
и проблемы, где именно сидит EOF нет
1
alsav22
5436 / 4831 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 15:28 #5
Можно исполозовать fgets() в параметрах условных операторов. Для них EOF - это не false, поэтому будет работать нормально для обоих файлов.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2013, 15:28
Привет! Вот еще темы с ответами:

Детектировать ошибку - C++
#include <iostream> #include <windows.h> #include <ddk\ntapi.h> #include <ddk\winddk.h> #include <ddk\ntddk.h> using...

Как работает программа? В чем суть функции fgets? - C++
#include <iostream> #include <stdio.h> int main(int argc, char** argv) //кол-во аргументов, указатель на массив указателей на сами...

как поставить EOF? - C++
Ребят, подскажите пожалуйста. Итак, вот листинг программы. Если я открываю файл, созданный с помощью потока, все читается без проблем(я так...

Детектировать итератор произвольного доступа - C++
здравствуйте, нужно детектировать итератор произвольного доступа... это не работает: template< typename... > using void_t = void; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru