我有这个简单的代码:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int main(int argc, char * argv[]){
int N = 4;
int *A = malloc( N * sizeof( *A ) );
for ( int i = 0 ; i < N; i++ )
A[ i ] = i;
FILE * theFile;
theFile = fopen( "theA", "wb" );
assert( NULL != theFile );
fwrite( A , sizeof( int ) , N , theFile );
fclose( theFile );
return 0;
}
现在,如果我在matlab中加载文件,它会显示:
0 0 0 0 1 0 0 0 2 0 0 0 3 0 0 0
如果我使用此代码来读取文件:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int main(int argc, char * argv[]){
int N = 4;
int *A = malloc( N * sizeof( *A ) );
FILE * theFile;
theFile = fopen( "theA", "wb" );
assert( NULL != theFile );
fread( A , sizeof( int ) , N , theFile );
fclose( theFile );
for ( int i = 0 ; i < N; i++ )
printf("\nA = %d",A[ i ] );
return 0;
}
它显示:
A = 0
A = 0
A = 0
A = 0
有任何解释吗?
在matlab我正在使用:
fid = fopen('theA','rb')
A = fread(fid);
答案 0 :(得分:2)
当你想阅读时,你打开了要写的文件:
theFile = fopen( "theA", "wb" );
^
|
FAIL
制作"rb"
。
当然,你应该检查来自I / O功能的返回值,如果你这样做,你会得知fread()
失败了,所以打印的值并不意味着任何东西。 I / O可以(并且会!)以有趣和教育的方式失败,始终检查返回值。
答案 1 :(得分:2)
第二部分:
应该是:
theFile = fopen( "theA", "rb" );
而不是:
theFile = fopen( "theA", "wb" );
答案 2 :(得分:2)
您需要在Matlab中指定precision
参数,否则默认情况下,Matlab fread
将逐字节读取。
默认值:'uint8 =&gt; double'
我的C
生锈但我想类int
投了一个32位有符号整数。您必须将此信息告知Matlab,否则它将使用上述默认解释。
所以在Matlab中,只需:
fid = fopen('theA','rb')
A = fread(fid , 'int32' );
fclose(fid) ;
这将导致:
A =
0
1
2
3
哪个应该是您的正常输出(至少它是您最初在文件中写的内容)。