Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > построчное чтение и запись в массив


Автор: eXa 26.2.2008, 14:55
spisok.txt
------------
test1
test2
test3
-------------

Код

int main() 
{ 
FILE* file = fopen("E:/Temp/sd/spisok.txt", "r");
char **str = new char*[10];
char buf[10];
int i = 0;
while(!feof(file))
{
 str[i] = fgets(buf, 10, file);
 i++;
}
 fclose(file);
 for(int t = 0; t < i; t++) printf("%s\n", str[t]);
}

Печать: test3
              test3
              test3


Почему массив заполняется только последней строчкой из файла "spisok.txt" уже голому сломалO_o Как правильно читать построчно и записывать в массив?

Автор: opjox 26.2.2008, 17:20
Потому, что в str[i] вы записываете адрес buf, а считываете вы все время только в buf. Вот, возможно, что вы хотели получить:
Код

int main(int argc, char ** argv)
{
  FILE * file = fopen("spisok.txt", "r");
  if(!file) {
    printf("not open file\n");
    return 1;
  }
  char ** str = new char*[10];
  int i = 0;
  while(!feof(file)) {
    str[i] = new char[10];
    fgets(str[i], 10, file);
    i++;
  }
  fclose(file);
  for(int j=0; j<i; j++) {
    printf("%s", str[j]);
    delete [] str[j];
  }  
  delete [] str;
  return 0;
}


P.S. не забывайте освобождать ресурсы.

Автор: eXa 27.2.2008, 00:53
Да так читается, но криво_O

Например txt фаил с таким содержанием
-----------
1233454
3554654654
565644
5675454
5645
546545345
5654543
456545
-----------

Код

int len;
for(int t = 0; t < i; t++)
{ len = strlen(str[t]);
   printf("%s:%i\r\n",str[t], len);}


Вот что получается на выходе

---------
1233454
:8
355465465:9
4
:2
565644
:7
5675454
:8
5645
:5
546545345:9

:1
5654543
:8
456545:6
---------

fscanf решила проблему




Автор: bsa 27.2.2008, 11:53
а как ты хотел прочитать строку из 10 символов в массив из 10 символов, у которого в конце еще завершающий ноль ставится (фактически размер массива - 9 символов)?

Автор: eXa 29.2.2008, 17:52
Максимальное число символов в строчке 9, 10 это как раз для нуля. Только причём тут это? fscanf читает только до пробела в строчки=\ что делать? как читать с пробелами?

Автор: opjox 29.2.2008, 18:26
Да, правда, в строке максимум у вас не 10, а все 11 символов:
3554654654 – тут десять + еще один на символ перехода на новую строку. Не забываем, что в программе нужен еще один для нуль-символа. 

Автор: codelord 29.2.2008, 19:03
Цитата(eXa @  29.2.2008,  13:52 Найти цитируемый пост)
Максимальное число символов в строчке 9, 10 это как раз для нуля. Только причём тут это? fscanf читает только до пробела в строчки=\ что делать? как читать с пробелами?

fgets
getline

Автор: eXa 1.3.2008, 17:08
ступил =\

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)