Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/26: Рейтинг темы: голосов - 26, средняя оценка - 4.50
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
1

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

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

Author24 — интернет-сервис помощи студентам
Выводится лишний символ "я" в самом конце текста, как бы я не изменял содержимое текстового файла
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.06.2012, 13:25
Ответы с готовыми решениями:

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

В выводе лишний символ, как избавится?
Всем привет!!! Вот такое задание: Написать функцию, которая возвращает истину, если передаваемое...

Как убрать лишний пробел при выводе?
Замучился, реально некто не знает что делать: #include &lt;iostream&gt; using namespace std; int...

Лишний символ при компиляции
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;stdio.h&gt; #include &lt;cstring&gt; #include &lt;conio.h&gt;...

15
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
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
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
26.06.2012, 14:35  [ТС] 3
Цитата Сообщение от gray_fox Посмотреть сообщение
Вообще, если пишешь на С++, логичнее было бы воспользоваться std::ifstream
Да, просто изучаю сейчас работу с файлами в RTL для общего развития, спасибо за помощь.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
26.06.2012, 14:43 4
Цитата Сообщение от gray_fox Посмотреть сообщение
или так
И чем это отличается от кода ТС'а?

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
ради интереса попробывал, но "я" осталось, странно...
Тогда покажи в точности тот код, который исполняешь ты и приаттачь в точности тот же самый текстовый файл. А то что-то ненормально
1
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
26.06.2012, 14:52 10
Цитата Сообщение от Evg Посмотреть сообщение
Более того, твой код неправильно отработает, если в файле есть байт со значением 0
Да, действительно.
0
32 / 32 / 3
Регистрация: 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 байт, 7 просмотров)
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
26.06.2012, 15:11 12
В общем на борландовском компиляторе всё нормально работает
0
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
26.06.2012, 15:17  [ТС] 13
Цитата Сообщение от Evg Посмотреть сообщение
В общем на борландовском компиляторе всё нормально работает
А у меня VS 2010 и "я" вставляет все равно, без "я" работает только первый код от "серой лисы", где мы прочитанный символ проверяем на совпадение с EOF.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
26.06.2012, 15:21 14
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
работает только первый код от "серой лисы", где мы прочитанный символ проверяем на совпадение с EOF
При посимвольном чтении я всегда пользовался только таким методом.

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

Не по теме:

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

0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
26.06.2012, 15:33 16
Цитата Сообщение от gray_fox Посмотреть сообщение
Вот это, кстати, не понятно, почему
Ну дык он же сначала на конец файла проверяет. И при пустом файле проверка сразу скажет "нет" и читать из файла ничего не будет
1
26.06.2012, 15:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.06.2012, 15:33
Помогаю со студенческими работами здесь

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

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

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

Убрать символ при выводе
У меня есть программа, которая меня цвет и вид курсора мыши. И выводит на экран какая кнопка мыши...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru