2014-02-05 2 views
0

Это мой код. Я пытаюсь прочитать двумерный массив из файла данных, но я получаю мусор. Что не так?Двумерный массив из файла данных в C

void read_array(int masyvas[][m]) 
{ 
    FILE *fp; 
    if ((fp=fopen("test.dat","wb+"))==NULL) 
    { 
     printf ("error \n"); 
     system("pause"); 
     exit (1); 
    } 
    printf("reading file\n"); 
    int x, y; 
    for(x = 0; x < n; ++x) 
    { 
     for(y = 0; y < m; ++y) 
     { 
      fread(&masyvas[x][y], sizeof(int),1,fp); 
      printf("%d ", masyvas[x][y]); 
     } 
     printf("\n"); 
    } 
} 
+0

Вы должны описать файл данных немного лучше. Является ли это двоичным файлом или файлом ASCII? Если он двоичный, он хранится в большом конце или немного endian? Есть ли заголовок, который описывает размер массива 2d? Убедитесь, что sizeof (int) в вашей системе одинаково, как в файле. и т. д. – oysteijo

ответ

1

Вы не проверяете звонки fread(); это всегда ошибка.

Остальная часть вашей проблемы в том, что режим "wb+" делает усечение до нулевой длины или создать двоичный файл для обновления, который, вероятно, не то, что вы хотели.

Заменить "wb+" с "rb+" (открытых двоичным файлом для обновления (чтения и записи)), который не обрежет файл.

Поскольку вы открыли файл в функции, вы также должны указать fclose() в функции. И поскольку вы никогда ничего не делаете с файлом, кроме как читать его, вам также не нужен режим обновления.

1

В настоящее время вы открываете свой файл как wb+. Вы хотите открыть его для чтения: rb+. См. Ниже: fopen.

Для лучшей читаемости и понимания, почему бы не следующий подход, как, например:

  • Прочитайте файл построчно (с помощью getline).
  • После того, как вы прочтете строку, просто отметьте ее (используя strtok).
  • Теперь, когда у вас есть маркеры для этой строки, вы можете заполнить массив в своем приложении.
  • Повторите шаг 1-3 до EOF.

Примечание: Это предполагает, что вы читаете текстовый файл и что он содержит разделители между каждой записью, которую вы хотите, чтобы заполнить ваш массив с (например, 1 2 3 4 5\n, может представлять собой одну строку в файле, где «1», '2', '3' - значения, которые должны быть сохранены, и \n заканчивает линию).

+0

Это двоичный файл, открытый с помощью '' wb + "' mode. –

+0

@JonathanLeffler исправлено. – bblincoe

+0

Обратите внимание, что для использования 'getline()' и т. Д. Вам нужен текстовый файл, а не двоичный файл. Конечно, любой такой ответ основывается на том, что файл данных является двоичным файлом; если это фактически текстовый файл, то, по вашему мнению, вероятно, намного лучше. –

0

Вы образец кода не компилируется.

Предполагая, что вы пытаетесь прочитать двоичный файл, содержащий целые числа в порядке нативного байта, вам должно быть что-то вроде следующего. Вместо того, чтобы читать его целым числом, целым числом, почему бы просто не разложить его одним махом?

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

#define ROWS 10 
#define COLS 5 

void read_array(int buf[ROWS][COLS]) 
{ 
    int x = 0 ; 
    int len = 0 ; 
    int cnt = ROWS*COLS ; // number of ints we can handle 
    FILE *fp = fopen("test.dat", "rb") ; // open the file for reading in binary mode 

    if (NULL == fp) 
    { 
    printf ("error \n"); 
    system("pause"); 
    exit (1); 
    } 

    printf("slurping the file\n"); 
    len = fread(buf,sizeof(int),cnt,fp) ; 
    printf("slurped!\n") ; 

    printf("loaded %d full rows" , len/COLS , len%COLS > 0 ? 1 : 0) ; 
    if (len%COLS > 0) 
    { 
    printf("and one partial row having %d columns." , len%COLS) ; 
    } 
    printf("\n") ; 

    for (x = 0 ; x < ROWS ; ++x) 
    { 
    int y ; 
    printf("row %d: " , x) ; 
    for (y = 0 ; y < COLS ; ++y) 
    { 
     printf("%d " , buf[x][y]) ; 
    } 
    printf("\n") ; 
    } 

    return ; 
} 

int main(int argc, char* argv[]) 
{ 
    int buf[ROWS][COLS] ; 
    memset(buf , (char)0 , sizeof(buf)) ; 
    read_array(buf) ; 
    return 0; 
} 
Смежные вопросы