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 回答