2011-10-09 50 views
3

我有一個包含以下數據的文本文件。從文件中讀取空格分隔的數字直到換行符

第一行是這樣的:

5 4 3 2 1

第二行是這樣的:

1 2 3 4 5

我想以一次讀取一行的數據,因爲我的第一個鏈接-list對象將使用第一行中的數據,而我的第二個鏈接列表對象將使用第二行中的數據。我所能想到的最好的功能如下:

void polynomial::allocate_poly(std::ifstream& in, const char* file, const char* number) 
{ 

    in.open(file); 

    std::string str; 
    char b; 
    int m = 0; 

    for(int i = 0; !in.eof(); ++i) 
    { 
     in >> b; 
     m = b - '0'; 
     a.insert(m); 
    } 

這種方法存在一些問題。我在我的for循環中嘗試了不同的二元運算符,如b == '\n',並且當b是換行符時,它們都不會觸發。

也以這種方式分配文件中的數字,它看起來像 5 5 4 3 2 1 1 2 3 4 5,所以它似乎是複製一個額外的5某處,我不知道這是否eof位。

我也試圖使用getline函數,但由於某種原因,它似乎只複製第一個整數,然後轉儲文件的其餘部分。我當然知道我沒有正確使用它,但是我可以找到的所有示例都是用於輸入文件名,例如cin.getline,我希望能夠在運行程序時將我的文件名作爲命令行參數傳遞。

我的問題是如何分配第一行上的數字直到換行符char,然後將ifstream in變量傳遞給另一個對象以分配第二行?謝謝你的幫助。

回答

9

你不會說什麼a是,但沒關係:如果你想要基於行的解析,你需要在外部循環中有getline。另外,從來沒有使用eof,因爲它不會做你想要的。而是使用隱式轉換爲bool來檢查操作是否成功。

這裏是典型的演出:

#include <sstream> 
#include <fstream> 
#include <string> 

std::string line; 
std::ifstream infile("myfile.txt"); 

while (std::getline(infile, line)) // this does the checking! 
{ 
    std::istringstream iss(line); 
    char c; 

    while (iss >> c) 
    { 
    int value = c - '0'; 
    // process value 
    } 
} 

然而,這種轉換從charint是繁瑣和脆弱。爲什麼不直接讀取整數?

int value; 
    while (iss >> value) { /* ... */ } 

編輯:基於您的評論,這裏的代碼來讀取正好兩行:

std::string line; 
int val; 

if (std::getline(infile, line)) 
{ 
    std::istringstream iss(line); 
    while (iss >> value) { /* process first line */ } 
} 
if (std::getline(infile, line)) 
{ 
    std::istringstream iss(line); 
    while (iss >> value) { /* process second line */ } 
} 
+0

雖然這比我以前好了很多,現在我不再有重複5在開始時,它遇到'\ n'字符時仍然沒有停止。 –

+0

@NicYoung:每一行將在外循環的每一輪中分別讀取。你只需要跟蹤循環迭代。或者,如果你確定有兩行,那麼不要使用'while'循環,而應該說'if(std :: getline(infile,line))'兩次('else'塊對應於錯誤條件)。 –

+0

這正是我需要的!非常感謝你。 –

相關問題