如何从文件中读取指向整数指针的指针?

时间:2012-07-15 15:08:00

标签: c pointers

我想读取一个指向文件中整数指针的指针。

我使用以下代码写入文件:

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);

我正在使用以下代码进行阅读,但在运行时遇到了seg-fault。

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分配的内存无效。关于我在这里做错了什么的想法?

2 个答案:

答案 0 :(得分: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,你很可能没有正确分配内存。留给你锻炼。

答案 1 :(得分: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);
}