С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/50: Рейтинг темы: голосов - 50, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 53

Посимвольное чтение из файла

09.05.2013, 16:17. Показов 10197. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добрый вечер (ночь)! Так сложилась ситуация что нужно мне посимвольно считать текст из файла fin в массив str[i][j], причем считывать надо только ДО символа переноса строки \n(включительно). Скажите пожалуйста почему не работает мой фрагмент (где-то зацикливается):
C++
1
2
3
4
5
6
7
8
9
10
11
while (!feof(fin))
    {
        do
        {
            str[i][j]=fgetc(fin);
            j++;
        }
        while (str[i][j]!='\n');
        i++;
        j=0;
    }
Добавлено через 20 часов 24 минуты
По ходу выполнения чтения в str[0][0] записывается ноль и больше ничего не происходит. В чем косяк?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.05.2013, 16:17
Ответы с готовыми решениями:

Посимвольное чтение файла в вектор
Вечер добрый. Есть файл sir.in.txt, содержащий строку ABC; посимвольно записываю его в вектор следующим образом: ifstream...

Посимвольное чтение
В консоль подается текст содержащий такие выражения: а=3 b=7 z=32 a=1 y=2 b=7 "EOF"-конец. программа не...

Посимвольное чтение массива char
Производится чтение из файла.Определенный диапазон считывается в переменную.Необходимо произвести посимвольное чтение из переменной и...

26
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
09.05.2013, 16:42
C++
1
2
3
4
5
6
    do
        {
            str[i][j]=fgetc(fin);
            j++; //<----------- Подумайте над этим) Подсказка, а именно о местоположении.
        }
        while (str[i][j]!='\n');
0
245 / 246 / 38
Регистрация: 08.04.2013
Сообщений: 927
09.05.2013, 16:45
C++
1
2
3
4
5
6
7
8
9
10
11
while (!feof(fin))
    {
        do
        {
            str[i][j]=fgetc(fin);
            j++;
        }
        while (str[i][j-1]!='\n');
        i++;
        j=0;
    }
0
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 53
09.05.2013, 16:57  [ТС]
Цитата Сообщение от stima Посмотреть сообщение
C++
1
2
3
4
5
6
    do
        {
            str[i][j]=fgetc(fin);
            j++; //<----------- Подумайте над этим) Подсказка, а именно о местоположении.
        }
        while (str[i][j]!='\n');
Насколько я понимаю тут все логично. заполнили 1 ячейку -> перешли на другую

Цитата Сообщение от metaluga145 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
while (!feof(fin))
    {
        do
        {
            str[i][j]=fgetc(fin);
            j++;
        }
        while (str[i][j-1]!='\n');
        i++;
        j=0;
    }
аналогично зацикливается

Главная суть: Мне нужно сохранить текст из файла сохраняя форматирование (отдельная строка текста в отдельной строке массива[количество символов в строке меньше 80, но в каждой строке по-разному]). Возможно вы предложите лучшее решение
0
245 / 246 / 38
Регистрация: 08.04.2013
Сообщений: 927
09.05.2013, 17:04
Вам поможет функция getline
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
09.05.2013, 17:12
Цитата Сообщение от undestroyer Посмотреть сообщение
Насколько я понимаю тут все логично. заполнили 1 ячейку -> перешли на другую
Какую вы ячейку проверяете? Дууумайте.
0
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 53
09.05.2013, 17:22  [ТС]
Цитата Сообщение от stima Посмотреть сообщение
Какую вы ячейку проверяете? Дууумайте.
какую только что заполнил. do ... while сначала выполняет блок do{}, потом проверяет условие в while. Заполнил ячейку очередным символом, если это символ переноса строки, то перехожу на другую строку (i++), если нет - продолжаю получать символы в текущую строку. Правильно?
0
245 / 246 / 38
Регистрация: 08.04.2013
Сообщений: 927
09.05.2013, 17:25
Цитата Сообщение от undestroyer Посмотреть сообщение
какую только что заполнил. do ... while сначала выполняет блок do{}, потом проверяет условие в while. Заполнил ячейку очередным символом, если это символ переноса строки, то перехожу на другую строку (i++), если нет - продолжаю получать символы в текущую строку. Правильно?
Нет. Сначала выполнится i++, а потом уже проверится условие
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
09.05.2013, 17:29
1. Прочитали символ. Сохранили его в i(0)j(0)
2. Инкрементируем j. Теперь там 1.
3. Проверили ячейку i(0)j(1).

Вопрос: Ну и что мы проверяем?
Вопрос 2: Это С или C++? Если С++ то http://www.cplusplus.com/refer... eam/tellg/.
0
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 53
09.05.2013, 17:37  [ТС]
Цитата Сообщение от metaluga145 Посмотреть сообщение
Нет. Сначала выполнится i++, а потом уже проверится условие
Спасибо, понял, но:
C++
1
2
3
4
5
6
7
8
9
10
11
while (!feof(fin))
    {
        j=0;
        do
        {
            str[i][j]=fgetc(fin);
            j++;
        }
        while (str[i][j-1]!='\n');
        i++;
    }
тоже где-то зацикливается.
Текст в тестируемом файле:
12354
4575
878
0
245 / 246 / 38
Регистрация: 08.04.2013
Сообщений: 927
09.05.2013, 17:42
попробуйте вместо feof написать EOF
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
09.05.2013, 17:49
Вы не хотите думать). Ладно:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int read_all(FILE* in, char** buff)
{
   if (!in) return 0;
   if (*buff) free(buff);
 
   int count = fseek (in, 0 , SEEK_END);
   *buff= (char*)malloc(count * sizeof(char));
 
   if (!*buff) return 0;
 
   fread (*buff, sizeof(char), count , in);
 
   return count;
}
0
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 53
09.05.2013, 18:04  [ТС]
Цитата Сообщение от metaluga145 Посмотреть сообщение
попробуйте вместо feof написать EOF
точно не то. ругается при компилировании (expression must have (pointer-to-) function type).
сейчас попробую переписать на getline

Добавлено через 15 минут
Цитата Сообщение от stima Посмотреть сообщение
Вы не хотите думать). Ладно:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int read_all(FILE* in, char** buff)
{
   if (!in) return 0;
   if (*buff) free(buff);
 
   int count = fseek (in, 0 , SEEK_END);
   *buff= (char*)malloc(count * sizeof(char));
 
   if (!*buff) return 0;
 
   fread (*buff, sizeof(char), count , in);
 
   return count;
}
спасибо за код, возможно его и возьму, только не понимаю для чего вы мне возвращаете count...
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
09.05.2013, 18:05
Это стандартная практика. Например если вы дальше будете записывать в файл? Что обратно цикл? или сразу блок в count charов
0
245 / 246 / 38
Регистрация: 08.04.2013
Сообщений: 927
09.05.2013, 18:13
stima, у меня пару вопросов по Вашему коду.
http://www.cplusplus.com/reference/cstdio/fseek/
fseek возвращает 0, если все прошло удачно. Да? что делает эта строка ?
C++
1
int count = fseek (in, 0 , SEEK_END);
Добавлено через 2 минуты
Кроме этого надо было сохранить каждую строку файла в отдельную строку. Вместо этого все что было в файле, оказалось в буфере. Как разобрать где там какая строка?
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
09.05.2013, 18:16
Вы правы ... используйте это ftell(in);
0
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 53
09.05.2013, 18:19  [ТС]
Вопрос всем: почему нужно использовать специальные функции для получения строки? почему нельзя посимвольно получать данные из файла и проверять очередной символ на перенос строки?
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
09.05.2013, 18:22
C
1
2
3
4
5
6
7
8
9
for (int i = 0, c = 0; (c = fgetc(fin)) != EOF; ++i)
{
     int j = 0;
     for ( ;str[i][j] != '\n'; ++j)
     {
          str[i][j] = c;
     }
     str[i][j] = 0;
}
п.с. не проверял, но должно работать)
0
245 / 246 / 38
Регистрация: 08.04.2013
Сообщений: 927
09.05.2013, 18:23
Цитата Сообщение от undestroyer Посмотреть сообщение
Вопрос всем: почему нужно использовать специальные функции для получения строки? почему нельзя посимвольно получать данные из файла и проверять очередной символ на перенос строки?
Зачем изобретать велосипед?
0
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 53
09.05.2013, 18:29  [ТС]
Цитата Сообщение от metaluga145 Посмотреть сообщение
Зачем изобретать велосипед?
когда мне нужно было провести какую-то обработку текста я всегда делал это "налету" посимвольно считывая из потока и сразу проводя нужные изменения. сейчас впервые приходится брать текст из файлов. хочется сделать по-привычке)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.05.2013, 18:29
Помогаю со студенческими работами здесь

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

Посимвольное чтение строки типа string
Здравствуйте! Подскажите, пожалуйста. У меня есть строка типа string, нужно все цифры вывести на печать. Как сделать &quot;пробежку по...

Как создать посимвольное чтение строки и загнать в массив
В консоль подается строка вида &quot;()(()))((&quot;, нужно создать динамический массив под нее, и загнать каждый символ строки туда, как это...

Посимвольное считывание из файла
Добрый вечер уважаемые формучане. Помогите найти ошибку в коде программы, реализующей алгоритм Вермана. При запуске виснет вся среда. ...

Посимвольное считывание из файла
Нужно считать данные из файла посимвольно, при этом не все подряд, а, например из 1й строчки с 5 символа, из 7 с 8 и тд. Кол-во строчек...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru