这是我的代码。我正在尝试从数据文件中读取二维数组,但我正在变得垃圾。怎么了?
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 :(得分:1)
您当前正在以wb+
模式打开文件。你想打开它阅读:rb+
。请参阅fopen
上的以下内容。
为了更好的可读性和理解,为什么不遵循这样的方法:
getline
)。 strtok
)。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;
}