fwrite打印垃圾值,如@@@@@

时间:2014-04-19 21:46:59

标签: c fwrite

double *array_out;
.......
FILE * pFile;
pFile = fopen ("Q1_n_iter.bin", "wb");
fwrite(array_out,sizeof(double),n*n,pFile);
fclose (pFile);

我检查过array_out是否正确填充,我无法弄清楚为什么它会打印垃圾而不是值。

1 个答案:

答案 0 :(得分:0)

写入文件的值fwrite不能直接用肉眼读取。您应该让计算机使用fread或其他东西为您解释它们。例如,您可以执行以下操作:

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

char * filename = "Q1_n_iter.bin";

int main( ) {
    double * array_out;
    double * array_in;
    FILE * pFile;

    array_out = malloc( 3 * sizeof * array_out );

    array_out[0] = 0.12;
    array_out[1] = 1.35;
    array_out[2] = 2.80;

    pFile = fopen( filename, "wb" );
    fwrite( array_out, sizeof * array_out, 3, pFile );
    fclose( pFile );
    free( array_out );

    array_in = malloc( 3 * sizeof * array_in );
    pFile = fopen( filename, "rb" );
    fread( array_in, sizeof * array_in, 3, pFile );

    for ( int i = 0; i < 3; i++ )
        printf( "%d: %.2f\n", i, array_in[i] );

    free( array_in );

    return 0;
}

并会收到以下输出:

0: 0.12
1: 1.35
2: 2.80

如果要将格式化数据打印到文件中,供人阅读,那么您应该使用函数fprintf。它的工作方式与printf类似,还有一个用于指定输出流的附加字段。

fprintf( FILE * stream, const char * FormatString, ... );

在您的情况下,您应该按以下方式进行:

// ...

for ( int i = 0; i < n * n; i++ )
    fprintf( pFile, "%.2f ", array_out[i] );

// ...

如果您不想将小数点后面的6位数作为默认值,请删除".2",如果您想要任何其他精度,请指定另一个数字。

编辑:

要使用命令行参数确定文件名来创建文件,您可以执行以下操作:

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

char * filename;

int main( int argc, char * argv[] ) {

    // declarations
    // and what not

    filename = malloc( 256 );
    sprintf( filename, "Q1_%d_%d.bin", n, iter );

    // whatever
    free( filename );

    return 0;
}

或者,如果您不想使用sprintf,请添加string.h库并:

    // ...
    strcpy( filename, "Q1_" );
    strcat( filename, argv[1] );
    strcat( filename, "_" );
    strcat( filename, argv[2] );
    strcat( filename, ".bin" );
    // ...
相关问题