Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.66/29: Рейтинг темы: голосов - 29, средняя оценка - 4.66
1 / 1 / 1
Регистрация: 12.05.2016
Сообщений: 29
1

Ifstream проверка на конец файла

07.10.2016, 22:17. Просмотров 6063. Ответов 7
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
float toFloat(char array[], int lenAr);// for delete dollar symbol and
                               // convert to float
int main()
{
    char fname[20], lname[20], buff[20];
    int week1, week2;
    float payRate;
    ifstream fin("timesheet.txt");
    ofstream fout("checks.txt");
 
while(fin)
{
    fin >> buff;
    for(int i = 0; i < 20; i++)
    {
        fname[i] = buff[i];
    }
    cout << fname << endl;
    fin >> buff;
    for(int i = 0; i < 20; i++)
    {
        lname[i] = buff[i];
    }
    cout << lname << endl;
    fin >> buff;
    week1 = stoi(buff);
    cout << week1 << endl;
    fin >> buff;
    week2 = stoi(buff);
    cout << week2 << endl;
    fin >> buff;
    cout << buff << endl;
    payRate = toFloat(buff, 20);
    cout << payRate << endl;
}
 
    return 0;
}
Мой тестовик выглядит так:
John Adams 30 55 $10
Lyndon Johnson 45 25 $8.50
Richard Nixon 30 30 $15.20
Как мне правильно закончить считывание? Сейчас у меня оно по сути идёт вечно.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2016, 22:17
Ответы с готовыми решениями:

Проверка существования файла с использованием ifstream()
гуглил, но ничего там так и не нашел. Собственно как?

специфичная проверка на конец файла
Дело в чем. Я считываю с файла 2 размерности , 2 матрицы и вектор. Потом надо провести проверку...

Проверка конец файла или нет
Подскажите пожалуйста если читаю числа типа int и не знаю когда конец файла как это...

Чтение с файла ifstream
не работает чтение из файла #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;iomanip&gt;...

7
Модератор
Эксперт С++
9802 / 8363 / 5091
Регистрация: 18.12.2011
Сообщений: 22,370
07.10.2016, 22:24 2
C++
1
2
if( !(fin>>buff) )
    break;
1
1 / 1 / 1
Регистрация: 12.05.2016
Сообщений: 29
07.10.2016, 22:51  [ТС] 3
Цитата Сообщение от zss Посмотреть сообщение
C++
1
2
if( !(fin>>buff) )
    break;
terminate called after throwing an instance of 'std::invalid_argument'
what(): stoi
0
шКодер самоучка
2094 / 1837 / 894
Регистрация: 09.10.2013
Сообщений: 4,008
Записей в блоге: 7
07.10.2016, 22:55 4
Лучший ответ Сообщение было отмечено T-59 как решение

Решение

T-59, сначала считываете строку целиком(std::getline), а потом разбираете ее на составные части, используя std::istringstream
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
#include <list>
 
struct data {
    std::string first_name, last_name;
    std::size_t week1, week2;
    double pay_rate;
};
 
using container = std::list<data>;
 
container load_data(std::ifstream& input);
 
int main() {
    std::ifstream fin("timesheet.txt");
    
    container table;
    try {
        table = load_data(fin);
    }
    catch(std::runtime_error& e) {
        std::cerr << e.what() << std::endl;
        return 0xdead;
    }
    
    for(const data& d : table) {
        std::cout << d.first_name <<  ' '  << d.last_name
                  << std::endl
                  << d.week1      << " - " << d.week2
                  << std::endl
                  << d.pay_rate
                  << std::endl
                  << std::endl;
    }
    return 0;
}
 
namespace tools {
    std::string right_trim(const std::string &str) noexcept {
        std::string::size_type last_space = str.find_last_not_of(" \t\r\n");
        return last_space == std::string::npos ? "" : (
                str.size() == (last_space + 1) ? str : str.substr(0, last_space + 1)
        );
    }
}
 
container load_data(std::ifstream& input) {
    container result;
    std::string line;
 
    while (std::getline(input, line)) {
        line = tools::right_trim(line);
        if (!line.empty()) {
            std::istringstream parser(line);
            data tmp;
            char sign;
            
            parser >> tmp.first_name
                   >> tmp.last_name
                   >> tmp.week1
                   >> tmp.week2
                   >> sign
                   >> tmp.pay_rate;
            if (parser.fail()) {
                throw std::runtime_error("parser.fail(): " + line);
            }
            if (sign != '$') {
                throw std::runtime_error("sign != '$': " + line);
            }
            result.push_back(tmp);
        }
    }
    return result;
}
1
1 / 1 / 1
Регистрация: 12.05.2016
Сообщений: 29
07.10.2016, 23:09  [ТС] 5
Макс, ваш вариант выглядит интересно, но что-то я не могу его осилить.

Добавлено через 10 минут
Задача решена. Считать данные из нескольких строк в переменные.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
float toFloat(char array[], int lenAr);// for delete dollar symbol and
                                                                            // convert to float
int main()
{
    char fname[20], lname[20], buff[20];
    int week1, week2;
    float payRate;
    ifstream fin("timesheet.txt");
    ofstream fout("checks.txt");
    char ch;
 
while(fin)
{
    fin >> buff;
    for(int i = 0; i < 20; i++)
    {
        fname[i] = buff[i];
    }
    cout << fname << endl;
    fin >> buff;
    for(int i = 0; i < 20; i++)
    {
        lname[i] = buff[i];
    }
    cout << lname << endl;
    fin >> buff;
    week1 = stoi(buff);
    cout << week1 << endl;
    fin >> buff;
    week2 = stoi(buff);
    cout << week2 << endl;
    fin >> buff;
    cout << buff << endl;
    payRate = toFloat(buff, 20);
    cout << payRate << endl;
    fin.ignore();
    if((ch = fin.get()) == EOF)
    {   
        fin.close();
        break;
    }
0
шКодер самоучка
2094 / 1837 / 894
Регистрация: 09.10.2013
Сообщений: 4,008
Записей в блоге: 7
07.10.2016, 23:19 6
Лучший ответ Сообщение было отмечено T-59 как решение

Решение

Цитата Сообщение от T-59 Посмотреть сообщение
но что-то я не могу его осилить
с комментариями:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
#include <list>
 
// структура с описанием полей в строке
struct data {
    std::string first_name, last_name;
    std::size_t week1, week2;
    double pay_rate;
};
 
// контейнер(список)
using container = std::list<data>;
 
// функция загрузки данных
container load_data(std::istream& input);
 
int main() {
    std::ifstream fin("timesheet.txt");
    //auto& fin = std::cin;
    
    container table;
    try {
        // пробуем загрузить список из файла
        table = load_data(fin);
    }
    catch(std::runtime_error& e) {
        // не получилось загрузить, печатаем ошибку и выходим
        std::cerr << e.what() << std::endl;
        return 0xdead;
    }
    // получилось загрузить
    // проходимся по списку и выводим данные 
    for(const data& d : table) {
        std::cout << d.first_name <<  ' '  << d.last_name
                  << std::endl
                  << d.week1      << " - " << d.week2
                  << std::endl
                  << d.pay_rate
                  << std::endl
                  << std::endl;
    }
    return 0;
}
 
namespace tools {
    // вспомогательная функция
    // удаляет пробельные символы с правого конца строки
    std::string right_trim(const std::string &str) noexcept {
        std::string::size_type last_space = str.find_last_not_of(" \t\r\n");
        return last_space == std::string::npos ? "" : (
                str.size() == (last_space + 1) ? str : str.substr(0, last_space + 1)
        );
    }
}
// функция загрузки данных
container load_data(std::istream& input) {
    container result; // список с результатом
    std::string line; // входная строка
 
    // читаем по строкам, пока на входе есть данные
    while (std::getline(input, line)) {
        line = tools::right_trim(line);
        // пропускаем пустые строки
        if (!line.empty()) {
            std::istringstream parser(line);
            data tmp;
            char sign;
            
            // пытаемся разобрать строку на части
            parser >> tmp.first_name
                   >> tmp.last_name
                   >> tmp.week1
                   >> tmp.week2
                   >> sign // пропускаем знак долора
                   >> tmp.pay_rate;
            // если неудалось разобрать
            if (parser.fail()) {
                // то грнерируем ошибку
                throw std::runtime_error("parser.fail(): " + line);
            }
            // если в строке небыло знака '$'
            if (sign != '$') {
                // то грнерируем ошибку
                throw std::runtime_error("sign != '$': " + line);
            }
            // удалось считать все данные - добавляем в список
            result.push_back(tmp);
        }
    }
    return result;
}
результат работы
1
1 / 1 / 0
Регистрация: 14.08.2014
Сообщений: 12
20.08.2018, 20:28 7
В ifstream есть специальный вызов, позволяющий проверить, не достигла ли программа конца файла.
C++
1
2
3
4
5
6
char ch;
ifstream fin("timesheet.txt");
if ((ch = in.eof()) == true) {
    // printf("eof!\n");
    break; 
}
0
шКодер самоучка
2094 / 1837 / 894
Регистрация: 09.10.2013
Сообщений: 4,008
Записей в блоге: 7
21.08.2018, 11:59 8
stas131, да, есть такой метод.
Но он служит для определения причины ошибки:
дело в том, что флаг eofbit выставляется после попытки чтения за границей файла.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.08.2018, 11:59

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Считывание из файла с ifstream
В файле записана матрица, чтоб программа в дальнейшем с ней работала, но выдаются лишь одни нули...

Считывание из файла - ifstream
Пожалуйста помогите! Сама пробовала! Без результатно!!! Пожалуйста помогите сделать так чтобы...

Чтение с файла. ifstream
Доброго времени суток. Нашёл тему, решил помочь человеку, в итоге сам запарился... Проблема в...

ifstream записать число из файла
Всем здрасьте. У меня вопросом по чтению файлов. Допустим есть у меня файл и я хочу записать...


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

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

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