Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
undestroyer
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 53
#1

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

09.05.2013, 16:17. Просмотров 1839. Ответов 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] записывается ноль и больше ничего не происходит. В чем косяк?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stima
432 / 287 / 16
Регистрация: 22.03.2011
Сообщений: 936
Завершенные тесты: 1
09.05.2013, 16:42     Посимвольное чтение из файла #2
C++
1
2
3
4
5
6
    do
        {
            str[i][j]=fgetc(fin);
            j++; //<----------- Подумайте над этим) Подсказка, а именно о местоположении.
        }
        while (str[i][j]!='\n');
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
09.05.2013, 16:45     Посимвольное чтение из файла #3
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;
    }
undestroyer
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 53
09.05.2013, 16:57  [ТС]     Посимвольное чтение из файла #4
Цитата Сообщение от 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, но в каждой строке по-разному]). Возможно вы предложите лучшее решение
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
09.05.2013, 17:04     Посимвольное чтение из файла #5
Вам поможет функция getline
stima
432 / 287 / 16
Регистрация: 22.03.2011
Сообщений: 936
Завершенные тесты: 1
09.05.2013, 17:12     Посимвольное чтение из файла #6
Цитата Сообщение от undestroyer Посмотреть сообщение
Насколько я понимаю тут все логично. заполнили 1 ячейку -> перешли на другую
Какую вы ячейку проверяете? Дууумайте.
undestroyer
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 53
09.05.2013, 17:22  [ТС]     Посимвольное чтение из файла #7
Цитата Сообщение от stima Посмотреть сообщение
Какую вы ячейку проверяете? Дууумайте.
какую только что заполнил. do ... while сначала выполняет блок do{}, потом проверяет условие в while. Заполнил ячейку очередным символом, если это символ переноса строки, то перехожу на другую строку (i++), если нет - продолжаю получать символы в текущую строку. Правильно?
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
09.05.2013, 17:25     Посимвольное чтение из файла #8
Цитата Сообщение от undestroyer Посмотреть сообщение
какую только что заполнил. do ... while сначала выполняет блок do{}, потом проверяет условие в while. Заполнил ячейку очередным символом, если это символ переноса строки, то перехожу на другую строку (i++), если нет - продолжаю получать символы в текущую строку. Правильно?
Нет. Сначала выполнится i++, а потом уже проверится условие
stima
432 / 287 / 16
Регистрация: 22.03.2011
Сообщений: 936
Завершенные тесты: 1
09.05.2013, 17:29     Посимвольное чтение из файла #9
1. Прочитали символ. Сохранили его в i(0)j(0)
2. Инкрементируем j. Теперь там 1.
3. Проверили ячейку i(0)j(1).

Вопрос: Ну и что мы проверяем?
Вопрос 2: Это С или C++? Если С++ то http://www.cplusplus.com/reference/i...istream/tellg/.
undestroyer
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 53
09.05.2013, 17:37  [ТС]     Посимвольное чтение из файла #10
Цитата Сообщение от 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
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
09.05.2013, 17:42     Посимвольное чтение из файла #11
попробуйте вместо feof написать EOF
stima
432 / 287 / 16
Регистрация: 22.03.2011
Сообщений: 936
Завершенные тесты: 1
09.05.2013, 17:49     Посимвольное чтение из файла #12
Вы не хотите думать). Ладно:
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;
}
undestroyer
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 53
09.05.2013, 18:04  [ТС]     Посимвольное чтение из файла #13
Цитата Сообщение от 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...
stima
432 / 287 / 16
Регистрация: 22.03.2011
Сообщений: 936
Завершенные тесты: 1
09.05.2013, 18:05     Посимвольное чтение из файла #14
Это стандартная практика. Например если вы дальше будете записывать в файл? Что обратно цикл? или сразу блок в count charов
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
09.05.2013, 18:13     Посимвольное чтение из файла #15
stima, у меня пару вопросов по Вашему коду.
http://www.cplusplus.com/reference/cstdio/fseek/
fseek возвращает 0, если все прошло удачно. Да? что делает эта строка ?
C++
1
int count = fseek (in, 0 , SEEK_END);
Добавлено через 2 минуты
Кроме этого надо было сохранить каждую строку файла в отдельную строку. Вместо этого все что было в файле, оказалось в буфере. Как разобрать где там какая строка?
stima
432 / 287 / 16
Регистрация: 22.03.2011
Сообщений: 936
Завершенные тесты: 1
09.05.2013, 18:16     Посимвольное чтение из файла #16
Вы правы ... используйте это ftell(in);
undestroyer
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 53
09.05.2013, 18:19  [ТС]     Посимвольное чтение из файла #17
Вопрос всем: почему нужно использовать специальные функции для получения строки? почему нельзя посимвольно получать данные из файла и проверять очередной символ на перенос строки?
stima
432 / 287 / 16
Регистрация: 22.03.2011
Сообщений: 936
Завершенные тесты: 1
09.05.2013, 18:22     Посимвольное чтение из файла #18
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;
}
п.с. не проверял, но должно работать)
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
09.05.2013, 18:23     Посимвольное чтение из файла #19
Цитата Сообщение от undestroyer Посмотреть сообщение
Вопрос всем: почему нужно использовать специальные функции для получения строки? почему нельзя посимвольно получать данные из файла и проверять очередной символ на перенос строки?
Зачем изобретать велосипед?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2013, 18:29     Посимвольное чтение из файла
Еще ссылки по теме:

Чтение из файла C++
C++ Посимвольное чтение массива char
Чтение файла с несколькими знаками конца файла C++
C++ Посимвольное чтение файла в вектор
C++ Посимвольное считывание из файла и проверка на наличие (+ показать количество операторов)

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

Или воспользуйтесь поиском по форуму:
undestroyer
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 53
09.05.2013, 18:29  [ТС]     Посимвольное чтение из файла #20
Цитата Сообщение от metaluga145 Посмотреть сообщение
Зачем изобретать велосипед?
когда мне нужно было провести какую-то обработку текста я всегда делал это "налету" посимвольно считывая из потока и сразу проводя нужные изменения. сейчас впервые приходится брать текст из файлов. хочется сделать по-привычке)
Yandex
Объявления
09.05.2013, 18:29     Посимвольное чтение из файла
Ответ Создать тему
Опции темы

Текущее время: 03:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru