Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.74/19: Рейтинг темы: голосов - 19, средняя оценка - 4.74
Заблокирован
1

Не могу считать из файла (посимвольно считать строчку)

28.11.2011, 22:04. Просмотров 3859. Ответов 12
Метки нет (Все метки)


Пытаюсь посимвольно из файла считать строчку.выдаёт access violation=(((.
C++
1
2
3
4
5
6
7
8
9
FILE* file11;
file11=fopen("records.txt","r");
for (int i=0;i<10;i++) {
  while ((buf1!="_")||(!feof(file11))) {
    buf1[0]=fgetc(file11);
    strcat(list1[i],buf1);
  }
}
fclose(file11);
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.11.2011, 22:04
Ответы с готовыми решениями:

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

Считать информацию из с файла массив посимвольно
с++ как достать инфу с файла, и забить в массив по-символьно?

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

Посимвольно считать текст из файла и распределить сколько каких символов в тексте
Решал задачу. Суть в том, что нужно взять текст из .txt файла. посимвольно считать и распределить...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
Записывайтесь на профессиональные курсы C++ разработчиков
12
871 / 447 / 35
Регистрация: 25.10.2011
Сообщений: 910
28.11.2011, 22:12 2
Цитата Сообщение от Alenka=) Посмотреть сообщение
strcat(list1[i],buf1);
Видимо проблема здесь, скорее всего размер list1 меньше индекса.
1
1998 / 1598 / 488
Регистрация: 31.05.2009
Сообщений: 2,990
28.11.2011, 23:00 3
Цитата Сообщение от Alenka=) Посмотреть сообщение
while ((buf1!="_")...
Это условие всегда будет равно true.

Добавлено через 1 минуту
Т.е. цикл у вас бесконечный.
0
Заблокирован
28.11.2011, 23:06  [ТС] 4
я наверно напутала с массивом строк. как завести правильно массив из 10 строк ( чтобы char овский тип был)??
0
1998 / 1598 / 488
Регистрация: 31.05.2009
Сообщений: 2,990
28.11.2011, 23:12 5
Цитата Сообщение от Alenka=) Посмотреть сообщение
я наверно напутала с массивом строк.
Нет, вы запутались со сравнением строк(вы сравниваете указатели), и условием в цикле
Цитата Сообщение от Alenka=) Посмотреть сообщение
как завести правильно массив из 10 строк ( чтобы char овский тип был)??
C++
1
char array[10][256]; // 10 строк по 256 символов каждая
1
Заблокирован
28.11.2011, 23:23  [ТС] 6
что-то совсем у меня ничего не выходит=(...всё равно access violation...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
char *bufr;
char list1[10][50];
...
FILE* file11;
file11=fopen("records.txt","r");
for (int i=0;i<10;i++) {
  int j=0;
  while (bufr!="_") {
    bufr[0]=fgetc(file11);
    list1[i][j]=bufr[0];
    j++;
  }
}
fclose(file11);
0
871 / 447 / 35
Регистрация: 25.10.2011
Сообщений: 910
28.11.2011, 23:31 7
Цитата Сообщение от rangerx Посмотреть сообщение
Т.е. цикл у вас бесконечный.
Кстати не обратил внимание на это. У вас вначале идет цикл 0..9, а затем еще один, который (после правок) будет считывать данные файла по 10 раз... хотя сейчас даже не соображу, что он будет считывать после первого раза, т.к. указатель будет в конце файла. Забейте в поиске форума открытие/сохранение бинарных файлов, т.к. примеров работы с ними привеликое множество. А то не понятно, то ли вы хотите в массив 10 раз файл записать или просто не так поняли реализацию.
0
Заблокирован
28.11.2011, 23:34  [ТС] 8
я пытаюсь из файла, в котором 10 строк считать каждую из них в отдельную строку.
0
871 / 447 / 35
Регистрация: 25.10.2011
Сообщений: 910
28.11.2011, 23:40 9
Символ переноса обозначается как '\n', но тут еще "соль" в том, что у вас ограничение массива в 50, а какое значение максимально принимает j не известно. Видимо из-за этого программа пытается вписать значение в несуществующий адрес. Поэтому нужно сделать исключение и если j > 49 то останавливать запись в текущую строку.
0
Заблокирован
28.11.2011, 23:45  [ТС] 10
вот изменила код. никакого результата=(((
C++
1
2
3
4
5
6
7
8
9
10
11
FILE* file11;
file11=fopen("records.txt","r");
for (int i=0;i<10;i++) {
  int j=0;
  while ((bufr[0]!='_')&&(j<=49)&&(bufr[0]!=feof(file11))) {
    bufr[0]=fgetc(file11);
    list1[0][j]=bufr[0];
    j++;
 }
}
fclose(file11);
0
1998 / 1598 / 488
Регистрация: 31.05.2009
Сообщений: 2,990
29.11.2011, 00:18 11
1) чем у вас инициализирован указатель buf1?
2) зачем вам этот указатель, если вы используете его как обычную символную переменную?
3) вы забываете про символ '\0' при посимвольном копировании.
Насколько я понимаю ваш код вам нужно нечто вроде
C++
1
2
for (int i = 0 ; (i < 10) && !feof(file11); i++)
    fscanf(file11, "%49[^\n_]", list1[i]);
1
Заблокирован
29.11.2011, 08:21  [ТС] 12
вот исправила.дело оказалось в том, что надо было просто символ в качестве буфера использовать.ошибку не выдаёт.только и чтения из файла не происходит=(.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
FILE* file11;
 file11=fopen("records.txt","r");
 for (int i=0;i<10;i++)
    {
     int j=0;
     while ((bufr!='_')&&(j<=48)&&(bufr!=feof(file11)))
          {
           bufr=fgetc(file11);
           list1[i][j]=bufr;
           j++;
          }
     list1[i][j]='\0';
}
 fclose(file11);
 for (int i=0;i<50;i++)
    {
     Label1->Caption=Label1->Caption+list1[0][i];
    }
0
1998 / 1598 / 488
Регистрация: 31.05.2009
Сообщений: 2,990
29.11.2011, 12:52 13
В этом участке кода
C++
1
bufr=fgetc(file11);
функция fgetc может вернуть EOF, поэтому делать
C++
1
list1[i][j]=bufr;
без провекри нельзя. Правильнее было бы сделать так
C++
1
2
3
4
5
6
7
8
9
10
for(int i = 0; i < 10; i++)
{
    int j = 0;
    while(((bufr  = fgetc(file11)) != '_') && (j <= 49) && !feof(file11))
    {
        list1[i][j] = bufr;
        j++;
    }
    list1[i][j] = '\0';
}
При счастливом стечении обстоятельств этот код даже может начать работать! Вообще, не зная формат файла, который вы пытаетесь считать мне сложно что-то посоветовать. Насколько я понимаю вам необходимо распарсить текст роль разделителя в котором играет символ "_". В таком случае лучше было бы воспользоваться функцией fscanf, приблизительно таким образом:
C++
1
2
3
4
5
6
7
8
int i; // в будет хранится число считанных строк
for(i = 0; i < 10 && !feof(file11); i++)
{
    fscanf(file11, "%*[\n_]");
        if(feof(file11)) break;
 
    fscanf(file11, "%49[^\n_]", list1[i]);
}
либо считать текст в буфер и разбить его с помощью функции strtok.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.11.2011, 12:52

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Файл: Считать из файла посимвольно текст и вывести его на экран. Объясните, как это работает.
Дали нам в вузе (1 курс) такой вот код, чтобы считать с файла посимвольно текст и вывести его //...

Необходимо считать данные с файла и поменять первую и вторую строчку в файле местами
Условие использовать процедуру. Попробовала сделать через массивы: program...

Считать посимвольно строку из консоли
Добрый день! Необходимо в программе организовать считывание длинной строки из консоли. Строка...

Посимвольно считать из переменной строку
Добрый вечер Нам задали написать программу &quot;Азбука МОРЗЕ&quot; Какой функцией считать посимвольно...


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

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

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