2013-08-30 62 views
2

我仍然認爲自己是一個新的webby in CI,我試圖讀取一個文件,文件不是二進制文件,但其大小從小尺寸的kbs到大尺寸文件feb Mbs.I使用fgets函數,我採取了reference from this link但編譯後,我得到分段fault.i試圖用gdb調試它,發現我能夠打開文件,但無法閱讀。這裏是我的代碼。使用fgets讀取文件並在屏幕上打印它的內容

#include<stdio.h> 
    #define MAX_LENGTH 1048576 
    int main() 
    { 
    FILE *fp; 
    char *result; 
    char line[MAX_LENGTH]; 
    fp =fopen("/home/shailendra/sampleprograms/C/shail1.txt","r"); 
    if(result=fgets(line,MAX_LENGTH,fp) != NULL) 
    printf("The string is %s \n",result); 

    else 
    printf("Error opening the file"); 

    if(fclose(fp)) 
    printf("fclose error"); 
    } 

該段錯誤真的很爛你blood.I明白,這是由於內存分配不足,但我用了MAX_LENGTH 1048576,所以我不認爲它必須創造任何疑難問題曾與試了一下包含只有一行的小文件和包含多行的大文件,但我無法弄清爲什麼我得到分段錯誤。

我也看過thisthis,但沒有得到任何幫助。

+0

「新威比」? :) – trojanfoe

+0

如果你在一個POSIX兼容的系統上,那麼使用'stat'來獲取文件大小,並將該內存量準確地分配爲一個緩衝區(這就是說,如果你必須一次讀取所有文件)。 – trojanfoe

回答

3

嘗試一些括號:

if((result=fgets(line,MAX_LENGTH,fp)) != NULL) 
^       ^

沒有那些你存儲的比較,而不是指向字符串的結果。


備註:根本不需要result。當它成功時,fgets返回你傳入的指針;換句話說,你可以printf的line

if(fgets(line, MAX_LENGTH, fp)) 
    printf("The string is %s \n", line); 

二邊注:試圖從文件與fgets之前,您應該檢查fopen是否成功:

if (!fp) 
    perror("fopen"); 
+0

是的,put()之後給出#include 之間的空格,我的代碼有效。它可能是另一個問題,我的代碼在讀取「\ n」後仍然正在讀取字符串,它會停止,因此是否有任何函數它可以刪除「\ n」,因爲在perl「chomp」中有一個函數。我知道我甚至沒有嘗試就這麼做。 – shailendra

+0

@shailendra沒有內建'chomp'函數,但你可以嘗試一個簡單的'line [strlen(line) - 1] = 0;'。如果你想要一個真正的chomp,有一個[着名的問題](http://stackoverflow.com/questions/122616/how-do-i-trim-leading-trailing-whitespace-in-a-standard-way)。 – cnicutar

0

夫婦的除了事情cnicutar的答案:

#include <stdio.h> 
     ^Please make sure you have a space between your includes and the headers 

fgets會讀,直到它遇到新行或EOF(以先到者爲準),所以閱讀日整個文件,你必須做一個循環。

我會建議做這樣的(無需對指針賦值爲指出):

while(fgets(line, MAX_LENGTH, fp)) 
    printf("%s", line); 
相關問題