Правильно хранить содержимое файла построчно в массив, а затем распечатывать содержимое массива

У меня проблемы с чтением содержимого моего массива. Я не уверен, правильно ли я его храню, так как мой результат для каждой строки - "1304056712".

#include <stdio.h>
#include <stdlib.h>

#define INPUT "Input1.dat"

int main(int argc, char **argv) {
 int data_index, char_index;
 int file_data[1000];

  FILE *file;
  int line[5];
  file = fopen(INPUT, "r");

  if(file) {
   data_index = 0;

   while(fgets(line, sizeof line, file) != NULL) {
    //printf("%s", line); ////// the line seems to be ok here
    file_data[data_index++] = line;
   }

   fclose(file);
  }

  int j;
  for(j = 0; j < data_index; j++) {
   printf("%i\n", file_data[j]); // when i display data here, i get '1304056712'
  }

 return 0;
}

3 ответа

Решение

Я думаю, что вам нужно сказать что-то вроде

file_data[data_index++] = atoi(строка);

Из ваших результатов я предполагаю, что файл представляет собой текстовый файл.

Вы не можете просто прочитать строку из файла (строку, массив символов) в массив целых чисел, это не будет работать. При использовании указателей (как вы делаете, передавая line в fgets()) для записи данных не будет выполнено преобразование. Вместо этого вы должны прочитать строку в массив символов и затем преобразовать ее в целые числа, используя либо sscanf(), atoi() или другая функция по вашему выбору.

fgets читает завершенные строки новой строки. Если вы читаете двоичные данные, вам нужно fread, Если вы читаете текст, вы должны объявить строку как массив символов, достаточно большой для самой длинной строки в файле.

Поскольку file_data является массивом char, file_data[data_index] является одним символом. Ему присваивается указатель (базовый адрес буфера int line[5]). При чтении двоичных данных file_data должен быть массивом целых чисел. Если вы читаете строки, это должен быть массив строк, то есть указатели на символы, такие как char * file_data[1000]

вам также нужно инициализировать data_index=0 вне if (file) ... блок, потому что выходной цикл должен быть установлен, даже если файл не удалось открыть. И при зацикливании и сохранении ввода цикл должен проверить, что он не достиг размера сохраняемого массива.

Другие вопросы по тегам