Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
alexjun
37 / 35 / 9
Регистрация: 13.02.2017
Сообщений: 202
Завершенные тесты: 1
1

Обработка конца строки при загрузке из файла

03.04.2017, 08:51. Просмотров 958. Ответов 7
Метки нет (Все метки)

День добрый.
Помогите, пожалуйста.

Исходные данные.
Есть класс:

C++
1
2
3
4
5
6
class ThingPtr
{
    string word;
    vector <int> pages;
...
}
Есть файл устроенный по типу:
word
pages pages... pages
word
pages pages... pages
...
word
pages pages... pages

Необходимо загрузить данные из файла в вектор ThingPtr'ов

Не могу обработать конец строки в строке интов. Все время загоняет в бесконечный цикл и ошибки.
Понаделал костылей, работает сейчас. Но костыли, есть костыли.

Костыль 1 - добавил в конец каждой строки интов - -1. Пробовал ставить его условием окончания строки. Но после этого на новую строку со стрингом не переходит. На следущей итерации загружает в string какой то хлам.
Костыль 2 - загоняю остатки во временный файл, просто ради того, чтобы перейти на новую строку файла.

Костыль 3 - цикл загрузки объектов не обрабатывает конец файла, пришлось добавлять доп условие в сам метод класса.

Как один из вариантов вижу загрузку строки с интами в string и уже из этой строки тянуть intы.
Но мне кажется должно быть более тривиальное решение.
Да и вообще хотелось бы знать, как грамотно обрабатывать конец строки.
Внятного ответа нигде не нашел.
Спасибо.

Также буду благодарен, если кто даст инфу где поподробнее расписано про работу с файлами.



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
// Вызов загрузки списка объектов из файла в вектор
 
void MenuLoadListFromFile::doCommand(vector <ThingPtr>& menuItem) //5
{
    cout << endl << "Вы выбрали загрузить список из файла" << endl;
    std::ifstream mFile;
    mFile.open("myList.txt");
 
    if (!mFile)
    {
        cout << "File не открыт" << endl;
        return;
    }
 
    while (!mFile.eof())      // цикл загрузки объектов
    {
        ThingPtr tempThing;
        tempThing.loadFromFileThing(mFile);
        menuItem.push_back(tempThing);
        cout << "Переход";
    }
    mFile.close();
}
 
 
 
// МЕТОД КЛАССА
 
 
void ThingPtr::loadFromFileThing(std::ifstream &mFile) // загрузка из файла одного слова и его страниц
{
    std::getline(mFile, word);
    cout << "word "<< word << endl;
    int buf;
    do
    {
        mFile >> buf;
                if (buf != -1)    // костыль 1 начало
        {
            pages.push_back(buf);
        }
        
    } while (buf != -1);            //костыль 1 продолжение
    
    string mTmp;                            //костыль 2
    std::getline(mFile, mTmp);
    
    if (mFile.eof()) { cout << "return 2"; return; }; //костыль 3
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.04.2017, 08:51
Ответы с готовыми решениями:

Чтение файла с n строки и до конца файла
как сделать так чтобы писало не с начала файла а например с середины и до конца? fstream...

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

Обработка Try.Except при загрузке из эксель файла
Загружаю данные из файла эксель в стринггрид.Код: function...

Обработка XML строки при загрузке dbf в Delphi
Пишу программу на Deplhi. программа загружает в себя dbf таблицу с полями: number, type,...

Обработка ошибки при загрузке для парсинга xml файла
помогите пожалуйста как сделать действие чтоб при ошибке загрузки файла по ссылке можно было это...

7
GbaLog-
Любитель чаепитий
3173 / 1477 / 467
Регистрация: 24.08.2014
Сообщений: 5,216
Записей в блоге: 1
Завершенные тесты: 2
03.04.2017, 09:19 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
while(mFile.peek() != EOF)
{
    ThingPtr tmp;
    
    mFile >> tmp.word;
    
    int tmpPage;
    
    while(mFile >> tmpPage)
    {
        tmp.pages.push_back(tmpPage);
    }
    
    mFile.clear();
    
    menuItem.push_back(tmp);
}
0
alexjun
37 / 35 / 9
Регистрация: 13.02.2017
Сообщений: 202
Завершенные тесты: 1
03.04.2017, 09:34  [ТС] 3
А если в файле вот так:

слово1
1 5 15
123
3 8 9

Он ведь чтение не сбойнет? И соответственно до клера не дойдет и в tmp.pages будет записано: 1, 5, 15, 123, 3, 8, 9.
А надо бы чтобы 123 сохранился как string в tmp.word

Добавлено через 3 минуты
И еще. Разве если в первой строке будет "много слов", он не заберет в word - "много", а на "слов" уйдет на следующий цикл? И соответственно там сразу же сбойнет поток и т.д. и т.п.
0
GbaLog-
Любитель чаепитий
3173 / 1477 / 467
Регистрация: 24.08.2014
Сообщений: 5,216
Записей в блоге: 1
Завершенные тесты: 2
03.04.2017, 09:41 4
Цитата Сообщение от alexjun Посмотреть сообщение
А если в файле вот так
тогда считывай строку и оттуда числа доставай.
http://en.cppreference.com/w/cpp/string/basic_string/getline
http://en.cppreference.com/w/cpp/string/basic_string/stol
Цитата Сообщение от alexjun Посмотреть сообщение
если в первой строке будет "много слов", он не заберет в word - "много", а на "слов" уйдет на следующий цикл.
ну для первого слова используй std::getline.
0
03.04.2017, 09:41
Antikl
с++
339 / 323 / 162
Регистрация: 15.07.2015
Сообщений: 1,717
Завершенные тесты: 6
03.04.2017, 09:43 5
ну пример выше скинули, пока нет конца файла EOF то цыкл будет продолжать работать
0
alexjun
37 / 35 / 9
Регистрация: 13.02.2017
Сообщений: 202
Завершенные тесты: 1
03.04.2017, 09:51  [ТС] 6
Цитата Сообщение от GbaLog- Посмотреть сообщение
тогда считывай строку и оттуда числа доставай.
Я так и думал, на крайняк делать.
Т.е. определить символ конца строки при работе из потока у меня не получится? И грубо говоря 12' ' и 12'\n' для >> неотличимы? Понять, что стоит после инта нереально?
0
GbaLog-
Любитель чаепитий
3173 / 1477 / 467
Регистрация: 24.08.2014
Сообщений: 5,216
Записей в блоге: 1
Завершенные тесты: 2
03.04.2017, 10:02 7
Лучший ответ Сообщение было отмечено alexjun как решение

Решение

Цитата Сообщение от alexjun Посмотреть сообщение
грубо говоря 12' ' и 12'\n' для >> неотличимы?
для пользователя нет.
Цитата Сообщение от alexjun Посмотреть сообщение
Понять, что стоит после инта нереально?
Цитата Сообщение от alexjun Посмотреть сообщение
Т.е. определить символ конца строки при работе из потока у меня не получится?
как вариант mFile.peek().
возвращает текущий символ в буфере, не вынимая его из потока.

самый простой для вас вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
while(mFile.peek() != EOF)
{
    ThingPtr tmp;
    
    std::getline(mFile, tmp.word);
    
    std::string pages;
    
    std::getline(mFile, pages);
    
    std::istringstream strm(pages);
    
    int tmpPage;
    
    while(strm >> tmpPage)
    {
        tmp.pages.push_back(tmpPage);
    }
    
    menuItem.push_back(tmp);
}
1
alexjun
37 / 35 / 9
Регистрация: 13.02.2017
Сообщений: 202
Завершенные тесты: 1
03.04.2017, 10:27  [ТС] 8
Спасибо!!!
Да, наверное самый оптимальный вариант.
0
03.04.2017, 10:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.04.2017, 10:27

Обработка ошибки при загрузке для парсинга xml файла
вот код var client = new HttpClient(); var uri = new...

Чтение 3-ей строки с конца файла!!!
Здравствуйте форумчане!! Вопрос такой, каким образом можно считать 3-ю строку с конца файла? Мой...

Чтение до конца файла и строки
Здравствуйте, форумчане! На днях в универе задали одну тривиальную задачку, но считывание...


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

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

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