2014-08-29 88 views
0

我是在linux下編寫c的新手,所以這可能是個愚蠢的問題,但我有使用fopen的問題。當我遇到我只是這真的是簡單的代碼試了一下這個問題:打開文件用fopen讀取的問題

#include <stdio.h> 
#include<stdlib.h> 

int main() 
{ 
    FILE *test; 

    if(fopen("test.txt","r") == NULL) 
     printf("didnt open"); 
    else 
     printf("opened!"); 

    fclose(test); 
} 

test.txt的是在同一文件夾中的代碼和a.out的。當我調試a.out時,我得到:

Breakpoint 1, main() at testit.c:14 
14  if(fopen("test.txt","r") == NULL) 
(gdb) s 
_IO_new_fopen (filename=0x400696 "test.txt", mode=0x400694 "r") at iofopen.c:103 
103 iofopen.c: No such file or directory. 
(gdb) s 
__fopen_internal (filename=0x400696 "test.txt", mode=0x400694 "r", is32=1) at iofopen.c:65 
65 in iofopen.c 
(gdb) c 
Continuing. 

Program received signal SIGSEGV, Segmentation fault. 
_IO_new_fclose (fp=0x0) at iofclose.c:54 
54 iofclose.c: No such file or directory. 

我試着改變路徑:if(fopen("/home/h1657/Work/test/test.txt","r") == NULL)。有同樣的效果。

對不起,如果這是基本問題,但我找不到任何解決方案。

+1

'FILE *測試;',你再使用爲什麼'FCLOSE(測試);'?它應該是'if((test = fopen(「test.txt」,「r」))== NULL)'並且最重要的是:test.txt存在於執行程序的當前目錄中? – 2014-08-29 08:55:04

+0

是'testtest.txt'完整路徑在您的代碼或打字錯誤在這裏? – kfmfe04 2014-08-29 08:57:14

回答

2

在發佈代碼的許多問題:

  • 您還沒有分配/初始化文件指針FILE *test;。所以它 將指向沒有/垃圾值。現在關閉使用fclose 會導致未定義的行爲。可能會導致程序崩潰。

    因此,代碼應該是

FILE *test; 
    test = fopen("test.txt","r"); 
    //close file pointer(after process on file) if fopen success. 
  • 先確認你是什麼文件名。如果這是testtest.txt OR
    test.txt OR test.txt.txt(在Windows中,它會發生,如果你手動 給.txt擴展名並隱藏擴展名)。首先需要確認它
    然後根據它在代碼中給出名稱。

  • 你有int main。所以,你應該在
    主要結束還有return 0

+0

那麼我應該發佈新的問題嗎? – traped 2014-08-29 11:18:44

+0

好的,謝謝你的建議和正確的答案。 – traped 2014-08-29 11:28:14

0

試試這個:

#include <stdio.h> 
#include<stdlib.h> 

int main() 
{ 
    FILE *test; 
    test = fopen("test.txt","r"); 

    if(test == NULL) 
    { 
     printf("didnt open"); 
    } 
    else 
    { 
     printf("opened!"); 

     fclose(test); 
    } 
} 

如果test.txt的是在相同的目錄中.c文件這隻會工作,否則你將不得不把完整的路徑在fopen函數。

+0

是的,我只注意到'fclose'之後,誠實的錯誤;) – Simpsons 2014-08-29 09:14:54

3

您不會將fopen的結果存入測試。該段錯誤是正常的,代碼應該是這樣的:

#include <stdio.h> 
#include<stdlib.h> 

int main() 
{ 
    FILE *test = fopen("test.txt","r"); 

    if(test == NULL) 
     printf("didnt open"); 
    else { 
     printf("opened!"); 
     fclose(test); 
    } 
} 

至於則fopen失敗:

fopen("/home/h1657/Work/testtest.txt", "r") 

如果你嘗試過,那麼文件名不是test.txt,或者你缺少一個/

您應該:

  • 檢查文件的權限。你能讀取文件嗎?
  • 檢查路徑;在執行文件的控制檯中,只需執行stat file.txt即可。如果失敗,其結果將是:統計:不能STAT'file.txt的「:沒有這樣的文件或目錄
1

你要的FOPEN返回值分配給您的文件指針。否則,你的FILE指針將指向一個任意地址(它是初始值,這很可能是垃圾)。當fclose解引用這個指針時,它會失敗。

此外,確保在打開文件失敗時退出程序。

3

關於gdb的消息:

iofopen.c: No such file or directory. 

你會得到該消息從gdb無論如何,即使你的代碼是正確的。這是因爲您正在使用step而不是next

完整的解釋如下:

「步驟命令下面的代碼到一個函數調用時 步進,GDB打印執行前每個源代碼行。如果你踩 成庫函數,GDB。想要顯示源文件,但這些文件在系統上不可用,但預計會有投訴,並且 無害。如果使用下一個命令,它將跳過,並且 將整個調用視爲一個步驟。

http://web.stanford.edu/class/cs107/guide_gdb.html

事實上,嘗試gdb一次正確的代碼step,你會得到同樣的消息iofopen.c: No such file or directory.