Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> построчное чтение и запись в массив 
V
    Опции темы
eXa
Дата 26.2.2008, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

Репутация: нет
Всего: нет



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 Как правильно читать построчно и записывать в массив?

PM MAIL   Вверх
opjox
Дата 26.2.2008, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 17.1.2008

Репутация: 2
Всего: 14



Потому, что в 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. не забывайте освобождать ресурсы.

PM MAIL ICQ   Вверх
eXa
Дата 27.2.2008, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

Репутация: нет
Всего: нет



Да так читается, но криво_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 решила проблему





Это сообщение отредактировал(а) eXa - 27.2.2008, 01:16
PM MAIL   Вверх
bsa
Дата 27.2.2008, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



а как ты хотел прочитать строку из 10 символов в массив из 10 символов, у которого в конце еще завершающий ноль ставится (фактически размер массива - 9 символов)?
PM   Вверх
eXa
Дата 29.2.2008, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) eXa - 29.2.2008, 17:52
PM MAIL   Вверх
opjox
Дата 29.2.2008, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 17.1.2008

Репутация: 2
Всего: 14



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

PM MAIL ICQ   Вверх
codelord
Дата 29.2.2008, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 1
Всего: 39



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

fgets
getline


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
eXa
Дата 1.3.2008, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

Репутация: нет
Всего: нет



ступил =\
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.