我想读取一个指向文件中整数指针的指针。
我使用以下代码写入文件:
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
分配的内存无效。关于我在这里做错了什么的想法?
答案 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);
}