2012-07-15 134 views
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無效的內存。關於我在這裏可能做錯了的任何想法?

+0

你絕對*不*閱讀「指針指針」。你有什麼是一個二維*數組*(你可能或不可以通過指針處理)。 – 2012-07-15 15:17:14

+3

@KerrekSB道歉。我正在發佈整個問題。之前提交過錯了。 – 2012-07-15 15:23:21

+0

@KerrekSB此外,我可能是錯的,但不是這是一個指針指針「int」?當然,在大多數情況下,它的行爲類似於2D陣列,但它不完全是一個。 – 2012-07-15 15:33:29

回答

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

int矩陣現在更換*input。如果你得到一個segfault,這很可能是你沒有正確分配內存。作爲練習留給你。

+0

謝謝,使用'fwrite \ fread'有什麼特別的錯誤嗎? – 2012-07-15 15:31:25

+0

@stressed_geek不,沒有錯......但是當你每次插入一個'int'時聽起來更自然。你也可以用你想輸出的行格式創建一個字符串,然後'fwrite \ fread'會更有意義。 – cybertextron 2012-07-15 17:01:20

+0

@stressed_geek另外,如果它解決了你的問題,你能接受我的答案嗎?因此,其他人可以稍後將其用作基準。 – cybertextron 2012-07-15 17:02:00