2015-12-01 43 views
-1

如果有人能幫助我克服這個令人驚訝的障礙。我試圖打開一個名爲「inputfile.txt」的文本文件,但我不能!我看過的每個例子都運行良好,但是當我嘗試使用它時,該文件返回null,並且出現分段錯誤。 注意,這是錯誤檢查從命令行讀取文本文件C

#include <stdio.h> 
int main(int argc, char *argv[]) 
{ 
    FILE *inputPtr; 
    inputPtr = fopen(argv[2], "r"); 
    fclose(inputPtr); 
} 

我意識到我「瘋玩」稍前,當我第一次創造了我桌面上的文本文件名爲我是「inputfile.txt」,但它被保存爲「 inputfile.txt.txt「就像這樣奇怪!

+1

能在你面前'fopen'行添加一條線,分享結果? 'printf(「Args =%d,文件名%s \ n」,argc,argc> 2?argv [2]:「OOB);」'在末尾加入'return 0;'是一個好主意。 –

+0

@MohitJain大聲笑我後來在我的代碼錯誤檢查以及。輸出是:Args = 4,文件名稱輸入文件。txt – John

+0

然後未能打開和分段錯誤(核心轉儲)之後 – John

回答

1

那麼第一個大問題就是你不檢查argc的值。該值設置爲傳遞給程序的參數數量。默認情況下,argc至少爲1,因爲總是傳遞1個參數。如果你傳遞任何額外的參數,ARGC必須大於1.在你的情況下,我想它應該是2. 第二個問題來自第一個。 C中的數組元素的編號從0開始,所以如果你的程序接受argc參數,保留參數的argv將有argc元素,但是!!!最後一個元素的索引將爲argc-1。默認情況下,如果沒有額外的參數傳遞只有argv[0]存在,它是PROGRAMM的名字,它也總是通過,因此的argc總是至少1

在你的情況,如果argc==2,然後做argv [2 ]根本不存在,只有argv[0]argv[1]存在。當你向程序傳遞一個參數時,它將被保存在argv [1]中。這意味着此行inputPtr = fopen(argv[2], "r");應該更改爲此inputPtr = fopen(argv[1], "r");。在程序開始時也應該檢查argc。沿

int main(int argc, char *argv[]) 
{ 
    if(argc!=2) 
    { 
    printf("Wrong number of arguments\n"); 
    return -1; 
    } 
..... 
} 
+0

該程序應該具有argc = 4,a.out,一個字符,輸入文件,輸出文件按照該順序。我不明白爲什麼這不起作用,因爲它適用於其他地方,我已經看到這個 – John

+0

好吧,如果它真的有這4個參數給初學者,那麼你應該真的檢查它,因爲也許,也許它不。 –

+1

謝謝你,這是一個很好的建議,但我意識到我通過將文本文件保存爲「inputfile.txt.txt」大聲笑感謝您的幫助! – John

0

訪問任何超出argv[0]前行soome的事情(這是始終可用)

代碼必須檢查的argc值,以保證命令行參數確實存在。

注意;在C中,數組索引從0開始(數組條目數-1)。

所以如果argc爲2,則僅存在一個命令行參數和:

  1. argv[0]被執行的程序名
  2. argv[1]是第一參數。
  3. argv[2]是一個NULL指針。

所以使用argv[2]正在訪問地址爲0,將導致

  1. 未定義行爲
  2. 導致了賽格故障事件