来自C中数据文件的二维数组

时间:2014-02-05 17:43:07

标签: c multidimensional-array

这是我的代码。我正在尝试从数据文件中读取二维数组,但我正在变得垃圾。怎么了?

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" ); 
    }
}

3 个答案:

答案 0 :(得分:1)

您当前正在以wb+模式打开文件。你想打开它阅读:rb+。请参阅fopen上的以下内容。

为了更好的可读性和理解,为什么不遵循这样的方法:

  • 逐行阅读文件(使用getline)。
  • 读完一行后,只需将其标记(使用strtok)。
  • 现在您已拥有该行的令牌,您可以在应用程序中填充该数组。
  • 重复步骤1-3,直到EOF

注意:这假设您正在阅读文本文件,并且它包含您希望填充数组的每个条目之间的分隔符(例如1 2 3 4 5\n,可能代表文件中的一行,其中' 1','2','3'是要存储的值,\n结束该行。

答案 1 :(得分:1)

您没有查看fread()来电;这总是一个错误。

其余的麻烦是"wb+"模式截断为零长度或创建二进制文件以进行更新,这可能不是您想要的。

"wb+"替换为"rb+"打开二进制文件以进行更新(读取和写入)),这不会截断文件。

由于您在函数中打开了文件,因此您还应该在函数中fclose()。由于除了读取之外你从不对文件做任何事情,你也不需要更新模式。

答案 2 :(得分: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;
}