2012-07-18 35 views
0

在標題中提到的三件事是有些新的給我。我從概念上熟悉它們,但這是我第一次試圖用C++從頭開始編寫我自己的程序,它涉及所有這三個方面。下面是代碼:指針,參數傳遞給主,和段錯誤

int main(int argc, char *argv[]) 
{ 
FILE *dataFile; 
char string [180]; 
dataFile = fopen(argv[1],"r"); 
fgets(string,180,dataFile); 
fclose(dataFile); 
} 

它編譯罰款,但是當我執行使用一個簡單的輸入文本文件,我得到一個分段錯誤。我搜索了多個教程,我無法弄清楚爲什麼。任何幫助,將不勝感激。

+0

參數是你通過命令行什麼('argv')? – Aesthete 2012-07-18 00:07:45

+0

@Aesthete只有一個文件名。它被稱爲testRead.txt。 – whatsherface 2012-07-18 00:10:51

+0

您是否檢查過您是否有足夠的權限閱讀文件? – user1205781 2012-07-18 00:14:52

回答

1

有你應該在這裏檢查的幾件事情。它仍然可能沒有達到你的期望,但它會避免你得到的錯誤。

int main(int argc, char** argv) 
{ 
    if(argc > 1) // FIRST make sure that there are arguments, otherwise no point continuing. 
    { 
    FILE* dataFile = NULL; // Initialize your pointers as NULL. 
    const unsigned int SIZE = 180; // Try and use constants for buffers. 
             Use this variable again later, and if 
             something changes - it's only in one place. 
    char string[SIZE]; 
    dataFile = fopen(argv[1], "r"); 
    if(dataFile) // Make sure your file opened for reading. 
    { 
     fgets(string, SIZE, dataFile); // Process your file. 
     fclose(dataFile); // Close your file. 
    } 
    } 
} 

請記住,在此之後,string仍可能爲NULL。見'fgets' for more information.

+0

謝謝你的建議。這對我非常有幫助,因爲我正在嘗試開發更好的編碼實踐。在閱讀您的帖子後,我還有其他問題。我正在嘗試讀取多行文件的每一行,直到文件結束並且遇到很多麻煩。我可以使用一個循環,並檢查字符串是否爲NULL,以表示文件的結尾? (另外,它會更好,如果我張貼這是一個新的問題?) – whatsherface 2012-07-18 04:29:23

+0

有看看'的std :: stringstream','的std ::函數getline」及其相關類。這應該讓你開始 - http://stackoverflow.com/questions/132358/how-to-read-file-content-into-istringstream – Aesthete 2012-07-18 04:56:42

+0

感謝您的幫助! – whatsherface 2012-07-19 20:28:58

2

有在你的代碼段故障的兩種可能的原因:

  • argv[1]不存在,在這種情況下,試圖訪問它會導致段錯誤。請檢查if (argc > 1)以避免此問題。
  • fopen沒有成功打開該文件,在這種情況下,嘗試從文件(fgets)或fclose讀它會導致段錯誤。在打電話之後立即檢查返回值不是NULL,例如, if (dataFile == NULL)
+0

謝謝,我檢查了這些東西,實際上返回值爲NULL。我將文件中的數據複製粘貼到一個不同的文件中,並將其重新存儲,只是一時興起,並不期望它能夠正常工作,但它確實如此。我不知道原始文件有什麼問題,因爲它也只是一個.txt文件。我仍然有點困惑,但現在很高興它的作品。 – whatsherface 2012-07-18 00:22:08