2011-11-18 94 views
2
#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

int main (int argc, char* argv[]) 
{ 
    string STRING; 
    ifstream infile;  
    STRING = argv[1]; 
    infile.open(argv[1]); 
    if (infile.fail())// covers a miss spelling of a fail name 
    { 
     cout << "ERROR. Did you make a mistake in the Spelling of the File\n"; 
     return 1; 
    } 
    else 
    { 
     while(!infile.eof()) 
     { 
      getline(infile,STRING); // Get the line 
      cout<<STRING + "\n"; // Prints out File line 
     } 
     infile.close(); 
     return 0; 
    } 
} 

如果用戶只運行沒有文件名的程序(我認爲是被稱爲參數)如./displayfile然後我得到我有這個計劃天晴,一個問題參數檢查

工作分段故障

我將如何修改我的代碼,使程序將與沿行的錯誤消息退出「添加文件名」

我首先想到的是沿

線的東西
if (!argc=2) 
{ 
    cout << "ERROR. Enter a file name"; 
    return 1; 
} 

新增: 萬一這個問題我使用編譯 G ++ displayfile.cpp -o displayfile

+1

檢查'argc',(「c」爲count)不是argv。 – Mat

+0

你的意思是argc,而不是argv? – 2011-11-18 13:16:44

+1

好的,通常的做法是至少檢查'argc'的值。 – jv42

回答

5
#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

int main (int argc, char* argv[]) { 
    if(argc != 2) { 
     cout << "You need to supply one argument to this program."; 
     return -1; 
    } 

    string STRING; 
    ifstream infile;  
    STRING = argv[1]; 
    infile.open(argv[1]); 
    if (infile.fail())// covers a miss spelling of a fail name { 
     cout << "ERROR. Did you make a mistake in the Spelling of the File\n"; 
     return 1; 
    } 
    else { 
     while(!infile.eof()) { 
     getline(infile,STRING); // Get the line 
     cout<<STRING + "\n"; // Prints out File line 
     } 
     infile.close(); 
     return 0; 
    } 
} 
+0

我已將此代碼添加到我的程序中,但我仍然遇到分段錯誤 – Dan1676

+0

好的解釋方式。 ;-) – netcoder

+0

嗯,我們總是可以使用這樣的東西:你犯了一個錯誤,因此我不會執行=) – Cyclonecode

0

變化STRING = argv[1];if (argv[1] != null) STRING = argv[1];不知道的,所以你得先測試一下。

+0

將不起作用,因爲在這種情況下'argv [1]'已經是一個錯誤。 –

+0

@ChristianRau好的,很高興知道^^ – Kevin

+1

它不會導致每個說的錯誤,但你會訪問數組超出其界限,這是未定義的行爲。 – netcoder

2

除了爲argc != 2明顯的支票我不由固定的一些糟糕的代碼和明顯的錯誤:

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

int main (int argc, char* argv[]) 
{ 
    if (argc != 2) 
    { 
     cout << "ERROR. Invalid number of arguments\n"; 
     return 1; 
    } 

    ifstream infile(argv[1]); 
    if (!infile)  // covers a miss spelling of a fail name 
    { 
     cout << "ERROR. Did you make a mistake in the Spelling of the File\n"; 
     return 1; 
    } 

    string STRING; 
    while(getline(infile, STRING)) 
     cout << STRING << '\n';  // Prints out file line 
    return 0; 
} 

你並不需要調用ifstream::open,只是使用構造函數,同樣你也不需要這麼早聲明STRING,也不需要將它初始化爲文件名,因爲你不使用它。不要忘記,這不是C,你不需要在每個函數的開頭都有一大堆聲明。

其次,檢查流的標誌通常是一個壞主意,只需檢查!infile以查找任何錯誤。但真正的錯誤是在while條件中檢查infile.eof,因爲它只會在getline試圖讀取文件末尾時才設置,所以您實際上會打印一個(可能是空的)行太多。只需檢查getline的返回值即可找到任何錯誤或文件結尾。

輸出時不要將換行符添加到字符串上,只是在字符串之後放出。最後但並非最不重要的一點,不需要infile.close,因爲無論如何析構函數都會調用它。