С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
37 / 35 / 9
Регистрация: 13.02.2017
Сообщений: 205
1

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

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

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

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

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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.04.2017, 08:51
Ответы с готовыми решениями:

Обработка символа конца строки при вводе
int main() { int n; std::cin &gt;&gt; n;//1 ввод std::cin.ignore(32767,'\n'); char...

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

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

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

7
Любитель чаепитий
3744 / 1800 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
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
37 / 35 / 9
Регистрация: 13.02.2017
Сообщений: 205
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
Любитель чаепитий
3744 / 1800 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
03.04.2017, 09:41 4
Цитата Сообщение от alexjun Посмотреть сообщение
А если в файле вот так
тогда считывай строку и оттуда числа доставай.
http://en.cppreference.com/w/c... ng/getline
http://en.cppreference.com/w/c... tring/stol
Цитата Сообщение от alexjun Посмотреть сообщение
если в первой строке будет "много слов", он не заберет в word - "много", а на "слов" уйдет на следующий цикл.
ну для первого слова используй std::getline.
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
03.04.2017, 09:43 5
ну пример выше скинули, пока нет конца файла EOF то цыкл будет продолжать работать
0
37 / 35 / 9
Регистрация: 13.02.2017
Сообщений: 205
03.04.2017, 09:51  [ТС] 6
Цитата Сообщение от GbaLog- Посмотреть сообщение
тогда считывай строку и оттуда числа доставай.
Я так и думал, на крайняк делать.
Т.е. определить символ конца строки при работе из потока у меня не получится? И грубо говоря 12' ' и 12'\n' для >> неотличимы? Понять, что стоит после инта нереально?
0
Любитель чаепитий
3744 / 1800 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
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
37 / 35 / 9
Регистрация: 13.02.2017
Сообщений: 205
03.04.2017, 10:27  [ТС] 8
Спасибо!!!
Да, наверное самый оптимальный вариант.
0
03.04.2017, 10:27
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.04.2017, 10:27
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Как программировать под HCL Notes и создавать свои продукты на ее основе
InfoMaster 11.01.2025
HCL Notes (ранее известный как IBM Notes и Lotus Notes) представляет собой мощную платформу для разработки корпоративных приложений, которая сочетает в себе функции электронной почты, календаря,. . .
Как работать с SVN (Subversion)
InfoMaster 11.01.2025
Введение Система контроля версий является неотъемлемой частью современного процесса разработки программного обеспечения. Она обеспечивает управление изменениями в коде, позволяет отслеживать. . .
Использование GraphQL в JavaScript
InfoMaster 11.01.2025
Введение в GraphQL и его преимущества В современной разработке веб-приложений эффективный обмен данными между клиентом и сервером играет ключевую роль. GraphQL представляет собой язык запросов и. . .
Администрирован­­­­ие Git, продвинутые техники работы с Git
InfoMaster 11.01.2025
Основы управления репозиторием Эффективное управление Git-репозиторием требует глубокого понимания механизмов контроля доступа и инструментов администрирования. Рассмотрим ключевые аспекты. . .
Что такое HCL Notes и как с ним работать
InfoMaster 10.01.2025
HCL Notes (ранее известный как IBM Notes и Lotus Notes) представляет собой комплексную платформу для совместной работы и обмена информацией в корпоративной среде. Это многофункциональное решение,. . .
Как работать с Git из Windows и Visual Studio
InfoMaster 10.01.2025
Работа с Git в Windows Работа с Git в операционной системе Windows может быть осуществлена с помощью различных инструментов, каждый из которых обладает своими уникальными возможностями и. . .
Аналог оператора switch case в Python
InfoMaster 10.01.2025
Оператор switch case используется в программировании для выбора одного из нескольких вариантов исполнения кода. Однако в языке Python этот оператор отсутствует. Понимание аналогов switch case в. . .
Отличия абстрактного класса от интерфейса
InfoMaster 10.01.2025
В современной разработке программного обеспечения существуют два основных механизма реализации абстракции: абстрактные классы и интерфейсы. Эти инструменты, хотя и схожи в своей основной цели -. . .
Как работать в Git
InfoMaster 10.01.2025
Git — это одна из наиболее популярных систем контроля версий, которая активно используется разработчиками по всему миру. Она позволяет эффективно управлять изменениями в коде, координировать работу. . .
Реализация передвижения персонажа в Unity3d на C#
InfoMaster 10.01.2025
Реализация передвижения персонажа в Unity3D начинается с правильной настройки проекта. Этот этап критически важен для создания отзывчивого и плавного управления. Рассмотрим основные шаги для создания. . .
Docker: руководство для начинающих
InfoMaster 10.01.2025
В современном мире разработки программного обеспечения контейнеризация стала неотъемлемой частью процесса создания и развертывания приложений. Docker, как ведущая платформа контейнеризации, произвела. . .
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru