Правильно хранить содержимое файла построчно в массив, а затем распечатывать содержимое массива
У меня проблемы с чтением содержимого моего массива. Я не уверен, правильно ли я его храню, так как мой результат для каждой строки - "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) ...
блок, потому что выходной цикл должен быть установлен, даже если файл не удалось открыть. И при зацикливании и сохранении ввода цикл должен проверить, что он не достиг размера сохраняемого массива.