2014-10-26 37 views
-1

爲什麼下面的代碼在運行時突然退出而不打印任何輸出???C程序中的fgets突然退出

FILE *file; 

file=fopen("filename","r"); 
char *line; 
while (fgets(line,1000,file)!=NULL) { 
    int i=0; 
    int l=sizeof(line); 
    printf("%d\n",l); 
    } 
+0

1000從哪裏來?換句話說,應該保存行數據的1000個字符在哪裏?你只有一個未初始化的指針指向任何合法的地方。 – 2014-10-26 17:23:56

+0

@MOehm這是我的代碼的一部分,文件是流的文件,它有多個lines.Each行可以有1000字符的最大 – Joker 2014-10-26 17:25:16

+1

是的,我可以看到你的意圖,但你需要將行存儲在一個數組,所以你需要'char line [1000]'。這會給你1000個字符來存儲該行。 (或者像Haris所建議的那樣保留'char * line'和'malloc',但是之後你必須'free'')'fgets'不會爲你自動分配內存。 – 2014-10-26 17:27:06

回答

5
char *line; 

這是一個字符指針,沒有指向任何內存..

fgets(line,1000,file)!=NULL 

,在這裏你試圖保存,你從它file讀取的字符串,不分配內存它

糾正,在你做fgets()malloc()來分配內存

line = malloc(1000); 

,或者聲明line變量作爲字符數組,這樣

char line[1000]; 
+0

@harris非常感謝,但是仍然爲每行打印4,即使在我的文件中沒有行的長度爲4 – Joker 2014-10-26 17:32:36

+4

因爲sizeof並不是要測量字符串長度。使用strlen。 – deviantfan 2014-10-26 17:33:30

1

你的節目說:讀了一堆數據出來的文件,並把它寫在程序的任意部分內存(堆棧,堆,代碼,無論什麼......)。不是一件好事。

一種方法來解決,改變char *linechar line[1000+1]

沒有必要在這裏使用指針或動態分配。

第二個錯誤,引用指針時不要使用sizeof(line)。它不像你想象的那樣工作。 strlen(線)更合適。通常,您最好使用常用常量來分配緩衝區大小並從文件中讀取。

const int MAXLINESIZE = 1000; 

char line[MAXLINESIZE+1]; 

fgets(line, MAXLINESIZE, file) 
0

注意讀取數組大小的新安全方式。這隻會讀取一個數組,所以你會知道它是一個數組而不是指針。其內置的安全功能。

#include "stdlib.h" // _countof() definition location 

// unlike sizeof, _countof works here for both narrow- and wide-character strings. 

_TCHAR arr[20], *p; 

//sizeof(arr) = 40 bytes 
//_countof(arr) = 20 elements 

// In C++, the following line would generate a compile-time error:  
// printf("%d\n", _countof(p)); 
// error C2784 (because p is a pointer) 

你可以看到_countof(數組名)是一個更好的選擇,如果你打算使用C.此外,它不是由寬字符影響;返回數組中正確數量的元素,與sizeof()不同。