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

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

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

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

26.06.2012, 13:25. Просмотров 1835. Ответов 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;
}
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 (СИ)
Есть содержимое файла: 12345 Once I caught a fish alive 45678910 Then I let it go again 111213314 Код выводит это...

Откуда берется лишний символ в конце строки? - C (СИ)
Эта программа должна считать среднее количество строк , но считает неправильно. #include &lt;stdio.h&gt; #include &lt;string.h&gt; int main () ...

Вопрос - добавляется лишний символ в письмо при отправке через phpmailer - PHP
Нужен ваш компетентный совет - при отправлении письма через phpmailer в код добавляется лишний символ - восклицательный знак, который...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
gray_fox
What a waste!
1507 / 1210 / 68
Регистрация: 21.04.2012
Сообщений: 2,545
Завершенные тесты: 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 .
gore-lykovoe
32 / 32 / 1
Регистрация: 04.04.2010
Сообщений: 414
26.06.2012, 14:35  [ТС] #3
Цитата Сообщение от gray_fox Посмотреть сообщение
Вообще, если пишешь на С++, логичнее было бы воспользоваться std::ifstream
Да, просто изучаю сейчас работу с файлами в RTL для общего развития, спасибо за помощь.
Evg
Эксперт CАвтор FAQ
17620 / 5844 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
26.06.2012, 14:43 #4
Цитата Сообщение от gray_fox Посмотреть сообщение
или так
И чем это отличается от кода ТС'а?

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

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

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

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

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

Не по теме:

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

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

Появляется лишний и непонятный ноль при выводе - C (СИ)
#include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; #define STR_LEN 64 typedef struct str { int num; char...

При вписывании в файл добавляется лишний символ - C (Си)
Данный ниже программик принимает в качестве первого аргумента название файла, в который вписываются последующие аргументы. Допустим,...

При считывании из файла находит лишний символ - C#
Есть строка в текстовом файле, разделителями являются только символы табуляции. 1003 Двигатель_Porshe 98704.65 Есть код: ...

Чтение строк файла - остается лишний символ при очередном проходе - C (СИ)
Здраствуйте. Есть функция которая циклично считывает строки и числа со стандартного потока. примерно так: #define SSC_OWNER 64 ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.06.2012, 15:26
Ответ Создать тему
Опции темы

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