2

ファイルから整数ポインタへのポインタを読みたかった。

次のコードを使用してファイルに書き込みます。

FILE *fp;
int **myArray = NULL;
int i, j;

for(i = 0; i < 3; i++){
    myArray = (int **)realloc(myArray, (i+1)*sizeof(int *));
    for(j = 0; j < 4; j++){
        myArray[i] = (int *)realloc(myArray[i], (j+1)*sizeof(int));
        myArray[i][j] = i*j*10;
    }
}

if((fp=fopen("test", "wb"))==NULL) {
    printf("Cannot open file.\n");
}
if(fwrite(myArray, sizeof(int), 3*4, fp) != 12)
    printf("File write error.");
fclose(fp);

次のコードを使用して読み取りを行っていますが、実行中にセグ フォールトが発生します。

FILE *fp;
int **myArray = NULL;
int i, j;

for(i = 0; i < 3; i++){
    myArray = (int **)realloc(myArray, (i+1)*sizeof(int *));
    for(j = 0; j < 4; j++){
        myArray[i] = (int *)realloc(myArray[i], (j+1)*sizeof(int));
    }
}

if((fp=fopen("test", "rb"))==NULL) {
    printf("Cannot open file.\n");
}

if(fread(myArray, sizeof(int), 3*4, fp) != 12) {
    if(feof(fp))
        printf("Premature end of file.");
    else
        printf("File read error.");
}

for(i=0; i < 3; i++){
    for(j = 0; j < 4; j++){
        printf("%d\n", myArray[i][j]);
    }
}

fclose(fp);

編集:より徹底的なデバッグで、fread関数が割り当てられたメモリをmyArray無効にしていることがわかりました。ここで私が間違っている可能性があることについてのアイデアはありますか?

4

2 に答える 2

1

使用する場合putc():

char ch;
FILE *input, *output;
input = fopen( "tmp.c", "r" );
output = fopen( "tmpCopy.c", "w" );
ch = getc( input );
while( ch != EOF ) {
  putc( ch, output );
  ch = getc( input );
}
fclose( input );
fclose( output );

次に、マトリックスに置き換え*inputます。intを取得している場合はsegfault、メモリを正しく割り当てていない可能性があります。あなたのための練習として残しました。

于 2012-07-15T15:16:04.740 に答える
1

ファイルからポインター (整数ポインターを含む何かへの) を読み取ることは非常にまれです。ファイル内の情報はプログラムの実行が終了した後も残りますが、プログラムの終了時にオペレーティング システムによってポインターの割り当てが解除されるため、これは異常です。

だから私はあなたが実際にいくつかの有用なデータ(あなたの場合は整数)を書きたい(そして読みたい)と仮定し、ポインタではありません - そしてあなたの書き込みコードは悪いです:

fwrite(myArray, sizeof(int), 3*4, fp)

ポインターの代わりにループを使用してデータを書き込みます。

for(i = 0; i < 3; i++)
{
    fwrite(myArray[i], sizeof(int), 4, fp);
}

次に、同様のループを使用してデータを読み取ります。

for(i = 0; i < 3; i++)
{
    fread(myArray[i], sizeof(int), 4, fp);
}
于 2012-07-15T19:16:04.247 に答える