Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
20 / 19 / 7
Регистрация: 31.01.2016
Сообщений: 79

Бесконечное считывание строки

17.02.2017, 15:43. Показов 3611. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Столкнулся со странной проблемой...Есть функция,которая считывает данные из файла, там есть такой кусок кода:
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
    DataIn.open("data.in");
    if (DataIn.is_open())
    {
        int i = 0;
        do
        {
            DataIn >> tmp;
 
        } while ((DataIn.peek() != '\n') || (DataIn.peek() != '\0'));
 
        do
        {
            DataIn >> trash;
        } while ((DataIn.peek() != '\n') || (DataIn.peek() != '\0'));
 
        while (!DataIn.eof())
        {
            DataIn >> var1[i];
 
            for (j = 0; j < MAX; j++)
            {
                DataIn >> var2[j * MAXSTEP + i];
            }
            i++;
        }
        length = i - 1;
        success = true;
    }
    else 
    {
        std::cout << "File 'data.in' not exist!" << std::endl;
        success = false;
    }
    DataIn.close();
В первой строке входного файла некие величины,во второй подписи для колонок,а потом начинаются колонки с данными.Суть проблемы в том,что уже при считывании данных с первой строки цикл уходит в бесконечность,то есть .peek() не видит символа конца строки.В чём может быть проблема?

P.S.: ранее эта программа считывала входные данные без нареканий,проблема возникла только с одним файлом.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.02.2017, 15:43
Ответы с готовыми решениями:

Бесконечное считывание в вектор циклом for
Вот цикл из учебника Страуструпа, там говорится что после того как ты ввел значения в вектор а затем нажал символ | то чтение прекратится....

"Бесконечное" считывание из файла. ifstream;
Суть такая, функция записывает в файл данные из моего списка, на каждую строку. вот эта функция: void outputFile(){ ...

Бесконечное считывание из сокета
Всем доброго времени суток! Написал программу для считывания страниц с протоколов htpp(s). Пока она совсем в &quot;альфа&quot; состоянии,...

12
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.02.2017, 15:49
Что за треш? Почти уверен, что вы упираетесь в EOF.

Зачем вообще этот peek понадобился? Скажите как расположены данные в файле и в какой формат хотите их считать.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
17.02.2017, 16:00
Цитата Сообщение от Tassadar_ Посмотреть сообщение
В чём может быть проблема?
В этом:
Цитата Сообщение от Tassadar_ Посмотреть сообщение
C++
1
while ((DataIn.peek() != '\n') || (DataIn.peek() != '\0'));
Во-первых, откуда там '\0' может взяться. Во-вторых, это условие всегда будет выполняться.
1
20 / 19 / 7
Регистрация: 31.01.2016
Сообщений: 79
17.02.2017, 16:00  [ТС]
Я считываю просто числа,разделённые пробелами и табуляцией. Первые строки выглядят так:
 
0.1 0.2 0.3 0.4 0.5 0.6
U0 U1 U2 U3 U4 U5 U6
0.0 10.0 11.0 12.0 13.0 14.0 15.0
0.5 0.0 1.0 2.0 3.0 4.0 5.0
Ну и далее много чисел.
peek() потому,что я не большой знаток С++,увидел на просторах интернетов такой вариант - вроде как мне подошёл,раньше работал без нареканий.
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
17.02.2017, 16:11
Действительно, Tassadar_, (DataIn.peek() != '\n') || (DataIn.peek() != '\0') всегда равно true.
Попробуйте, посчитайте
C++
1
2
3
4
5
6
char ch = 30;
//char ch = '\n';
//char ch = DataIn.peek();
bool b1 = (ch != '\n');    
bool b2 = (ch != '\0');    
bool result = ( b1 || b2 );
1
20 / 19 / 7
Регистрация: 31.01.2016
Сообщений: 79
17.02.2017, 16:12  [ТС]
Почему условие (DataIn.peek() != '\n') будет выполняться всегда?Насколько я нашёл,символ '\n' (и '\0' в Linux,насколько я понял) является символом конца строки,разве нет?То есть условие должно выполняться,пока не встретиться символ конца строки,правильно я понимаю?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
17.02.2017, 16:20
Цитата Сообщение от Tassadar_ Посмотреть сообщение
Почему условие (DataIn.peek() != '\n') будет выполняться всегда?
Такое не всегда, но у тебя же так:
Цитата Сообщение от Tassadar_ Посмотреть сообщение
C++
1
(DataIn.peek() != '\n') || (DataIn.peek() != '\0')
Или первое будет выполняться, или второе, а значит общий результат выражения всегда будет true. Общий результат выражения будет false, когда следующий символ одновременно будет и '\n', и '\0', что невозможно.
1
17.02.2017, 16:21

Не по теме:

Tassadar_, ну скопируйте и посчитайте :D

C++
1
2
3
4
5
6
char ch = 30;
//char ch = '\n';
//char ch = DataIn.peek();
bool b1 = (ch != '\n');    
bool b2 = (ch != '\0');    
bool result = ( b1 || b2 );
Неужели так трудно набрать Ctrl+c Ctrl+p ?

0
20 / 19 / 7
Регистрация: 31.01.2016
Сообщений: 79
17.02.2017, 16:30  [ТС]
Аааа,Семён Семёныч!Понял,затупил.

Всё заработало.Я не знаю,после чего именно,но вся история была такая:
- программа уходила в бесконечное считывание;
- я поискал символы конца строки;
- добавил второе условие с '\0';
- написал сюда;
- пока скидывал пример того,что есть в файле,увидел там пробел в конце строки,в то время как во всех прочих его не было;
- убрал пробел;
- потупил на форуме;
- убрал второе условие с '\0';
- всё заработало.

Всем спасибо!

Добавлено через 2 минуты

Не по теме:

У меня,как вы могли заметить,есть некоторые проблемы с типом bool и с логикой=)Я так понимаю,что там нужно будет этот result поместить в while?

0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
17.02.2017, 16:31
Цитата Сообщение от Tassadar_ Посмотреть сообщение
Насколько я нашёл,символ '\n' (и '\0' в Linux,насколько я понял) является символом конца строки,разве нет?
Не совсем. Это не конец строки ('\0' - это для Си-строк конец строки, в текстовом файле его не должно быть), а символ начала новой строки (символ перевода строки). В Windows это два символа: \r\n, в Linux один: \n, в Mac OS тоже один: \r.
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.02.2017, 16:31
Цитата Сообщение от Tassadar_ Посмотреть сообщение
Я считываю просто числа,разделённые пробелами и табуляцией.
А это тогда что:
Цитата Сообщение от Tassadar_ Посмотреть сообщение
U0 U1 U2 U3 U4 U5 U6
Что с этим надо делать?
0
20 / 19 / 7
Регистрация: 31.01.2016
Сообщений: 79
17.02.2017, 16:38  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
Что с этим надо делать?
С этим не делается ничего,это просто мусор для программы,но это используется для построений графиков как подписи к колонкам.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.02.2017, 16:52
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
 
int main()
{
    std::ifstream ifs("input.txt");
    std::vector<double> vals;
    std::string str;
    while (ifs >> str)
    {
        try
        {
            vals.push_back(std::stod(str));
        }
        catch (std::invalid_argument &)
        {}
    }
    for (const auto x : vals)
        std::cout << x << std::endl;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.02.2017, 16:52
Помогаю со студенческими работами здесь

Бесконечное повторение цикла по добавлению строки
ох и достал я всех тут наверно.. но т.к. учусь, все равно задам вопросик Private Sub CommandButton1_Click() With...

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

Считывание Определенной Строки Из Файла По Номеру Строки?
Считывание Определенной Строки Из Файла По Номеру Строки? // В БД Слов содержиться в текстовом файле, нужно рандомно считывать одно...

Считывание строки без переноса строки
Здравствуйте! Есть такой теоретический вопрос: Как оформить считывание и сравнение строк в файле, в котором последняя строка не имеет...

считывание строки. С++
Строка считывается посимвольно буквами. а надо, чтобы словами.. как это сделать? FILE *fp2 = fopen(&quot;V.txt&quot;, &quot;rb&quot;);...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru