2014-12-18 4 views
0

У меня есть это как мои структурыPrintf не печатает правильный номер

struct theFile{ 
     int count; 
     FILE *fPointer; 
     int *fileItems[]; 
    }myFile; 

Это мой метод, который сохраняет файл в fileItems. Он правильно сохраняет номера. Например fileItems[0] = 5, fileItems[1] = 45, fileItems[2] = 35

void saveFile(){ 
     myFile.fPointer = fopen("mileage.txt", "r"); 
     int i = 0; 

     while (!feof(myFile.fPointer)){ 
      myFile.fileItems[i] = (int*)malloc(sizeof(int)); 
      fscanf(myFile.fPointer, " %d,", myFile.fileItems[i]); 
      i++; 
     } 
     myFile.count = i; 
    } 

, но когда я иду, чтобы распечатать содержимое файла с помощью этого метода он будет напечатан первый номер правильно, но тогда он будет печатать остальное в больших количествах. Может кто-то, пожалуйста, скажите мне, почему он не печатает правильное содержимое массива.

void viewFile(){ 
     for(int i = 0; i < myFile.count; i++){ 
      printf("%d, ", myFile.fileItems[i]); 
     } 
    } 

также обратите внимание, в настоящее время написано в c.

+1

'fileItems' - это массив указателей, поэтому вам придется разыгрывать его дважды. В предположении: '& (myFile.fileItems [i])'. – Evert

+1

Но увидев ваше использование 'fileItems', вам лучше объявить' fileItems' как целочисленный массив: 'int * fileItems'. Затем измените свои 'malloc' и' fscanf' соответственно. – Evert

+1

любая причина, по которой вы проверяете успех 'fopen()' или 'malloc()'? BTW, пожалуйста, [не использовать] (http://stackoverflow.com/q/605845/2173917) возвращаемое значение 'malloc()'. –

ответ

2

int *fileItems[]; равно int ** fileItems; Скорее всего, вы хотите массив целых чисел, и не массив указателей на целые числа.

Изменение структура декларации в int * fileItems; и выделить список однажды цикла:

myFile.fileItems = malloc(sizeof(int) * initialNumberOfElements); 

Позже, если initialNumberOfElements был слишком мал, то в realloc больше пространства:

myFile.fileItems = realloc(myFile.fileItems, sizeof(int) * biggerElementCount); 

Тогда аргумент в fscanf сусле be &myFile.fileItems[i].

Не забудьте добавить код обработки ошибок для случаев, когда функция распределения не работает. То же самое касается любых используемых вами функций файлов: все операции ввода-вывода могут завершиться неудачно.

+0

должен ли realloc быть добавлен в цикл while в файле saveFile с выражением if, если if (i> = initialNumberOfElements), то используйте realloc? – bobby

+1

@bobby, если это возможно, вам стоит подумать о записи числа 'int' в файле перед списком' int', таким образом вы можете прочитать номер, а затем выделить правильное количество 'int', и вы выиграли ' t нужно «realloc». – ElderBug

+0

@bobby Да, это идея. Вероятно, вы хотите сохранить переменную 'currentArrayCapacity', вокруг которой будет отслеживаться, насколько велик массив. – user694733

0

Сделайте свою декларацию в строении.

struct theFile{ 
    int count; 
    FILE *fPointer; 
    int *fileItems[MAX];// MAX=10; 
}myFile; 

Пустой индекс массива не может знать, как массивы указывают.

1

fscanf Просьба указать указатель в качестве аргумента, но обычно это адрес существующего int, а не «реального» int*. Вы, вероятно, хотели написать:

struct theFile{ 
    int count; 
    FILE *fPointer; 
    int fileItems[N]; // You need to put a value as N, like 10, or else the array will be of size 0 
}myFile; 

Тогда

fscanf(myFile.fPointer, " %d,", &myFile.fileItems[i]); // with a & to get the address 

Таким образом, вам не нужно malloc и free. Остальное хорошо после этого.

Редактировать: Если вы не знаете, сколько int у вас будет, ответ пользователя694733 лучше.

+0

Это достаточно простая альтернатива, если 'N' известно заранее. Но цикл должен иметь дополнительную проверку 'i user694733

Смежные вопросы