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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
gore-lykovoe
32 / 32 / 1
Регистрация: 04.04.2010
Сообщений: 414
#1

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

26.06.2012, 13:25. Просмотров 1948. Ответов 15
Метки нет (Все метки)

Выводится лишний символ "я" в самом конце текста, как бы я не изменял содержимое текстового файла
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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2012, 13:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Лишний символ в конце при выводе через fgetc (C++):

Мусор при выводе не смотря на \0 символ в конце строки - C++
qq Есть проблемка с выводом мусора в конце строки Вот код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cstring&gt; ...

Лишний символ при компиляции - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;stdio.h&gt; #include &lt;cstring&gt; #include &lt;conio.h&gt; int zamena(char c); using...

Лишний символ при работе со строками - C++
(объясните, пожалуйста откуда он берется и как от него избавиться) код: #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; ...

Как убрать запятую в конце при циклическом поштучном выводе слов? - C++
for(int i=0;i&lt;CountExact; i++ ) { Console.Write(&quot;{0},&quot;, exact); }вывожу последовательно...

Исправить ошибку, при которой не работает cin после vector'a (лишний символ '\n' в потоке ввода) - C++
Столкнулся с этой проблемой в другой программе,но решил написать более примитивную и посмотреть, что будет. В итоге тоже самое после cin...

Убрать символ при выводе - C++
У меня есть программа, которая меня цвет и вид курсора мыши. И выводит на экран какая кнопка мыши нажата. Но у меня почему-то еще в конце,...

15
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
26.06.2012, 14:10 #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 .
1
gore-lykovoe
32 / 32 / 1
Регистрация: 04.04.2010
Сообщений: 414
26.06.2012, 14:35  [ТС] #3
Цитата Сообщение от gray_fox Посмотреть сообщение
Вообще, если пишешь на С++, логичнее было бы воспользоваться std::ifstream
Да, просто изучаю сейчас работу с файлами в RTL для общего развития, спасибо за помощь.
0
Evg
Эксперт CАвтор FAQ
18248 / 6373 / 438
Регистрация: 30.03.2009
Сообщений: 17,640
Записей в блоге: 28
26.06.2012, 14:43 #4
Цитата Сообщение от gray_fox Посмотреть сообщение
или так
И чем это отличается от кода ТС'а?

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

Добавлено через 2 минуты
После замены "a+" на "r" я проблем не вижу - у меня без "я" работает
0
gore-lykovoe
32 / 32 / 1
Регистрация: 04.04.2010
Сообщений: 414
26.06.2012, 14:43  [ТС] #5
Цитата Сообщение от Evg Посмотреть сообщение
Кстати, "a+" - это открытие файла на дозапись, а тебе надо "r" - на чтение
да, знаю, просто потом fputs буду еще использовать.
0
Evg
Эксперт CАвтор FAQ
18248 / 6373 / 438
Регистрация: 30.03.2009
Сообщений: 17,640
Записей в блоге: 28
26.06.2012, 14:45 #6
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
да, знаю, просто потом fputs буду еще использовать
А это и порождает проблему. Проверка feof тебе не показывает, что достигнут конец файла (т.к. файл на запись). Далее ты пытаешься читать из файла, обламываешься (fgetc возвращает тебе -1 и оно печатается как "я") и затем Feof начинает срабатывать, т.к. к файлу была операция чтения и теперь действительно есть конец файла. На на запись feof смысла не имеетт
1
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
26.06.2012, 14:46 #7
Цитата Сообщение от Evg Посмотреть сообщение
И чем это отличается от кода ТС'а?
Тем, что сначала читаем, а потом проверяем, а не наоборот, нет?
0
gore-lykovoe
32 / 32 / 1
Регистрация: 04.04.2010
Сообщений: 414
26.06.2012, 14:48  [ТС] #8
Цитата Сообщение от Evg Посмотреть сообщение
После замены "a+" на "r" я проблем не вижу - у меня без "я" работает
ради интереса попробывал, но "я" осталось, странно...
0
Evg
Эксперт CАвтор FAQ
18248 / 6373 / 438
Регистрация: 30.03.2009
Сообщений: 17,640
Записей в блоге: 28
26.06.2012, 14:50 #9
gore-lykovoe, почитай тут (включая ссылки, которые там приводятся): 10 вопросов по С. part1

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

Добавлено через 1 минуту
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
ради интереса попробывал, но "я" осталось, странно...
Тогда покажи в точности тот код, который исполняешь ты и приаттачь в точности тот же самый текстовый файл. А то что-то ненормально
1
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
26.06.2012, 14:52 #10
Цитата Сообщение от Evg Посмотреть сообщение
Более того, твой код неправильно отработает, если в файле есть байт со значением 0
Да, действительно.
0
gore-lykovoe
32 / 32 / 1
Регистрация: 04.04.2010
Сообщений: 414
26.06.2012, 14:57  [ТС] #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;
}
0
Вложения
Тип файла: txt text.txt (48 байт, 6 просмотров)
Evg
Эксперт CАвтор FAQ
18248 / 6373 / 438
Регистрация: 30.03.2009
Сообщений: 17,640
Записей в блоге: 28
26.06.2012, 15:11 #12
В общем на борландовском компиляторе всё нормально работает
0
gore-lykovoe
32 / 32 / 1
Регистрация: 04.04.2010
Сообщений: 414
26.06.2012, 15:17  [ТС] #13
Цитата Сообщение от Evg Посмотреть сообщение
В общем на борландовском компиляторе всё нормально работает
А у меня VS 2010 и "я" вставляет все равно, без "я" работает только первый код от "серой лисы", где мы прочитанный символ проверяем на совпадение с EOF.
0
Evg
Эксперт CАвтор FAQ
18248 / 6373 / 438
Регистрация: 30.03.2009
Сообщений: 17,640
Записей в блоге: 28
26.06.2012, 15:21 #14
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
работает только первый код от "серой лисы", где мы прочитанный символ проверяем на совпадение с EOF
При посимвольном чтении я всегда пользовался только таким методом.

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

Не по теме:

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

0
26.06.2012, 15:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2012, 15:26
Привет! Вот еще темы с ответами:

При выводе char* в конце строки "tr" - C++
struct List { char* inf; List* next; }; void AddToHead(List* &amp;head, char* inf) { List* p = new List; p-&gt;inf = inf; ...

Контейнер map. Выводит лишний символ - C++
Вот код. Шифр простой замены. В конце выводит последний символ 2 раза подряд. #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;map&gt; ...

Произвольный доступ в файл. Лишний символ новой стоки - C++
Здравствуйте, помогите разобратся. #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main(){ ifstream...

Access violation при выводе массива через функцию - C++
Приветствую вас, прошу помощи в объяснении что же не так.(В частности проблема с указателями) На данный момент программа должна...


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

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

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