Форум программистов, компьютерный форум CyberForum.ru

Лишний символ в конце при выводе через fgetc - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
26.06.2012, 13:25     Лишний символ в конце при выводе через fgetc #1
Выводится лишний символ "я" в самом конце текста, как бы я не изменял содержимое текстового файла
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
    system ("chcp 1251 > nul");
    FILE* pfile;
    pfile = fopen ("D:\\text.txt", "a+");
    if ( !pfile )
        cout << "Файл не найден" << endl;
    else
    {
        cout << "Файл открыт" << endl;
        while ( !feof( pfile ) )
            cout << char ( fgetc( pfile ) );
    }
    fclose ( pfile );
    cout << endl;
    system ("pause");
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
26.06.2012, 14:10     Лишний символ в конце при выводе через fgetc #2
Надо сначала читать символ, потом проверять на конец файла, например так:
C
1
2
3
4
int ch;
while ((ch = fgetc(pfile)) != EOF) {
   // ...
}
или так:
C
1
2
3
4
int ch;
while ((ch = fgetc(pfile)) && !feof(pfile)) {
   // ...
}
Это 'я' наверняка и есть EOF.

Добавлено через 1 минуту
Вообще, если пишешь на С++, логичнее было бы воспользоваться std::ifstream .
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
26.06.2012, 14:35  [ТС]     Лишний символ в конце при выводе через fgetc #3
Цитата Сообщение от gray_fox Посмотреть сообщение
Вообще, если пишешь на С++, логичнее было бы воспользоваться std::ifstream
Да, просто изучаю сейчас работу с файлами в RTL для общего развития, спасибо за помощь.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
26.06.2012, 14:43     Лишний символ в конце при выводе через fgetc #4
Цитата Сообщение от gray_fox Посмотреть сообщение
или так
И чем это отличается от кода ТС'а?

Добавлено через 2 минуты
Кстати, "a+" - это открытие файла на дозапись, а тебе надо "r" - на чтение

Добавлено через 2 минуты
После замены "a+" на "r" я проблем не вижу - у меня без "я" работает
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
26.06.2012, 14:43  [ТС]     Лишний символ в конце при выводе через fgetc #5
Цитата Сообщение от Evg Посмотреть сообщение
Кстати, "a+" - это открытие файла на дозапись, а тебе надо "r" - на чтение
да, знаю, просто потом fputs буду еще использовать.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
26.06.2012, 14:45     Лишний символ в конце при выводе через fgetc #6
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
да, знаю, просто потом fputs буду еще использовать
А это и порождает проблему. Проверка feof тебе не показывает, что достигнут конец файла (т.к. файл на запись). Далее ты пытаешься читать из файла, обламываешься (fgetc возвращает тебе -1 и оно печатается как "я") и затем Feof начинает срабатывать, т.к. к файлу была операция чтения и теперь действительно есть конец файла. На на запись feof смысла не имеетт
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
26.06.2012, 14:46     Лишний символ в конце при выводе через fgetc #7
Цитата Сообщение от Evg Посмотреть сообщение
И чем это отличается от кода ТС'а?
Тем, что сначала читаем, а потом проверяем, а не наоборот, нет?
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
26.06.2012, 14:48  [ТС]     Лишний символ в конце при выводе через fgetc #8
Цитата Сообщение от Evg Посмотреть сообщение
После замены "a+" на "r" я проблем не вижу - у меня без "я" работает
ради интереса попробывал, но "я" осталось, странно...
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
26.06.2012, 14:50     Лишний символ в конце при выводе через fgetc #9
gore-lykovoe, почитай тут (включая ссылки, которые там приводятся): 10 вопросов по С. part1

Цитата Сообщение от gray_fox Посмотреть сообщение
Тем, что сначала читаем, а потом проверяем, а не наоборот, нет?
У тебя всегда после чтения делается проверка. У ТС'а тоже (ибо после чтения мы придём в начало while и сделаем проверку). Но у ТС'а код более корректный, т.к. при пустом файле он отработает правильно. А твой - нет. Более того, твой код неправильно отработает, если в файле есть байт со значением 0

Добавлено через 1 минуту
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
ради интереса попробывал, но "я" осталось, странно...
Тогда покажи в точности тот код, который исполняешь ты и приаттачь в точности тот же самый текстовый файл. А то что-то ненормально
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
26.06.2012, 14:52     Лишний символ в конце при выводе через fgetc #10
Цитата Сообщение от Evg Посмотреть сообщение
Более того, твой код неправильно отработает, если в файле есть байт со значением 0
Да, действительно.
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
26.06.2012, 14:57  [ТС]     Лишний символ в конце при выводе через fgetc #11
Цитата Сообщение от Evg Посмотреть сообщение
Тогда покажи в точности тот код, который исполняешь ты и приаттачь в точности тот же самый текстовый файл. А то что-то ненормально
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
    system ("chcp 1251 > nul");
    FILE* pfile;
    pfile = fopen ("D:\\text.txt", "r");
    if ( !pfile )
        cout << "Файл не найден" << endl;
    else
    {
        cout << "Файл открыт" << endl;
        while ( !feof( pfile ) )
            cout << char ( fgetc( pfile ) );
    }
    fclose ( pfile );
    cout << endl << endl;
    system ("pause");
    return 0;
}
Вложения
Тип файла: txt text.txt (48 байт, 6 просмотров)
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
26.06.2012, 15:11     Лишний символ в конце при выводе через fgetc #12
В общем на борландовском компиляторе всё нормально работает
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
26.06.2012, 15:17  [ТС]     Лишний символ в конце при выводе через fgetc #13
Цитата Сообщение от Evg Посмотреть сообщение
В общем на борландовском компиляторе всё нормально работает
А у меня VS 2010 и "я" вставляет все равно, без "я" работает только первый код от "серой лисы", где мы прочитанный символ проверяем на совпадение с EOF.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
26.06.2012, 15:21     Лишний символ в конце при выводе через fgetc #14
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
работает только первый код от "серой лисы", где мы прочитанный символ проверяем на совпадение с EOF
При посимвольном чтении я всегда пользовался только таким методом.

А что касается варианта с feof'ом - может какие-то хитрости есть, я на практике им не пользовался
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
26.06.2012, 15:26     Лишний символ в конце при выводе через fgetc #15
Цитата Сообщение от Evg Посмотреть сообщение
Но у ТС'а код более корректный, т.к. при пустом файле он отработает правильно. А твой - нет.
Вот это, кстати, не понятно, почему.

Не по теме:

"серой лисы"
Попрошу без "вольных переводов" )

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2012, 15:33     Лишний символ в конце при выводе через fgetc
Еще ссылки по теме:

Не понятный дополнительный символ в конце файла C++
C++ Мусор при выводе не смотря на \0 символ в конце строки
C++ Контейнер map. Выводит лишний символ

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
26.06.2012, 15:33     Лишний символ в конце при выводе через fgetc #16
Цитата Сообщение от gray_fox Посмотреть сообщение
Вот это, кстати, не понятно, почему
Ну дык он же сначала на конец файла проверяет. И при пустом файле проверка сразу скажет "нет" и читать из файла ничего не будет
Yandex
Объявления
26.06.2012, 15:33     Лишний символ в конце при выводе через fgetc
Ответ Создать тему
Опции темы

Текущее время: 13:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru