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

Работа с файломи... - C++

Восстановить пароль Регистрация
 
jallvar
0 / 0 / 0
Регистрация: 30.12.2010
Сообщений: 5
30.12.2010, 16:31     Работа с файломи... #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
 
ifstream f("file.txt");
while (true)
{
    int v;
    f >> v;
    if(!f .eof())
        cout << v << endl;
    else
        break;
}
system("pause");
return 0;
}
file.txt
1
2
3
4
5
6
7
8
9
10
При запуске программы бесконечно в одну колонку выдает следуйщие число..
-858993460
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.12.2010, 16:31     Работа с файломи...
Посмотрите здесь:

Работа с файломи C++
Работа с файломи C++
C++ Работа с файломи
Потоки.Работа с файломи.Очередь.Стек. C++
Изучение работы с файломи .txt C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
30.12.2010, 16:50     Работа с файломи... #2
попробуй так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <fstream>
#include<conio.h>
using namespace std;
 
int main()
{
    ifstream f("file.txt");
    if(!f){cerr<<"file not found"; getch();return 0;} 
    int v;
    while (true){
        f >> v;
        if(!f .eof()) cout<<v<<" "<<endl;
        else break;
    }
    system("pause");
}
jallvar
0 / 0 / 0
Регистрация: 30.12.2010
Сообщений: 5
30.12.2010, 22:36  [ТС]     Работа с файломи... #3
Странно O-o
Когда я через визуал нажимаю происходит такое чуду..
А когда через каталог(вручную откр. exe ) Всё нормально ... С чем может быть связанно. Во всяком случае спасибо...
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
31.12.2010, 15:23     Работа с файломи... #4
Не то. ВАши коды не сработают если файл будет пуст.
Вот заключительный вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
 
        ifstream f("file.txt");
        if(!f){cerr<<"file not found"; getchar();return 0;} 
        int v;
while (true)
{
        f >> v;
        if (!f.fail())
         cout << v << endl;
        else
         break;
}
system("pause");
return 0;
}
Добавлено через 15 часов 5 минут
Кстати, варианты
igorrr37,
jallvar,
неправильны ещё и вот по какой причине. Дело в том, что f.eof() возвращает true, когда активен eofbit (то ли флаг какой-то, то ли ещё что) А он, в свою очередь становится активным, КОГДА ИЗ ФАЙЛА СЧИТЫВАТЬ БОЛЬШЕ НЕЧЕГО.

Разберём подробнее.

Допустим,есть текстовый файл 1 2 3 4 5 6 7 8 9

Причём очень важно то, как вы его создали. Пусть он создан просто вручную записыванием цифр в файл, по введении числа 9 файл сохранён.
Произойдёт следующее: считается число 9, активируется eofbit (ведь считывать из файла больше нечего), f.eof вернёт истину, сработает break и цикл прервётся, а число 9 НЕ НАПЕЧАТАЕТСЯ.

Вот поэтому и не надо такой код использовать
C++
1
2
                f >> v;
                if(!f .eof()) cout<<v<<" "<<endl;
Хотя если вдруг создавая текстовый файл после 9-ки вы что нибудь напишите, например пробелы или переведёте
каретку на другую строку, тогда после считывания 9-ки файл НЕ БУДЕТ ПУСТ и следовательно 9-ка напечатается.

Ну вот, можно сказать что поэтому цитируемыый вариант то работает, то не работает

ВАриант с испльзованием f.fail () более надёжен потому, что
возвращает истину, если в предыдущем считывании была ошибка, только и всего.
При считывании последнего числа ошибки не будет и оно выведется.

А дальше будет ошибка, ведь число последнее (и не важно идут после него нечитаемые символы или нет),
а мы считываем в переменную типа int.





Это значит, что когда вы считаете
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
31.12.2010, 17:31     Работа с файломи... #5
девятка печатается даже если после неё ничего нет, а eofbit похоже устанавливается по результатам проведённой операции, т.е. после девятки стоит символ конца файла - 26 в аски кодах, и после его считывания eofbit и будет установлен
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
31.12.2010, 18:03     Работа с файломи... #6
Цитата Сообщение от igorrr37 Посмотреть сообщение
девятка печатается даже если после неё ничего нет
Цитата Сообщение от igorrr37 Посмотреть сообщение
т.е. после девятки стоит символ конца файла
Молодой человек, вы уж определитесь пожалуйста, есть у вас что-то после девятки или нет.

И что значит -26?
Я например сильно сомневаюсь что там после девятки есть что-то, соответствующее -26. Если это непечатаемый символ, берите hex- редактор, открывайте в нём файл и смотрите, что там за -26

А вообще вот, может пригодиться
Существует ли EOF или это миф?
jallvar
0 / 0 / 0
Регистрация: 30.12.2010
Сообщений: 5
31.12.2010, 21:26  [ТС]     Работа с файломи... #7
Спасибо.. Kravam
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
01.01.2011, 01:45     Работа с файломи... #8
kravam
насчёт отсутствия символа eof похоже вы правы, соглашаюсь
Yandex
Объявления
01.01.2011, 01:45     Работа с файломи...
Ответ Создать тему
Опции темы

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