2013-03-12 77 views
0

我有一個非常長的.txt文件,我想使用getline進行流式處理。我想輸入這個整個文本文檔,然後通過一個過程運行它。連續輸入使用getline到txt文檔結尾的行C++

然後,我想通過使用不同值的相同過程來運行該新字符串,等等2次。

到目前爲止,我有通過運行一個程序的整個文件

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

void flag(string & line, int len); 
void cut(string & line, int numb); 

int main() 
{ 
    string flow; 
    ifstream input; 
    ofstream output; 
    input.open(filename.c_str()); //filename ... 

    output.open("flow.txt"); 

    while (!input.fail()) 
     getline(input, flow); 
    flag(flow, 10); 
    flag(flow, 20); 
    cut(flow, 20); 
    cut(flow, 3); 

    output << flow; 

    return 10; 
} 
//procedures are defined below. 

我有麻煩。我將如何使用getline進行流式處理。

我已經試過getlineinfile.failnpos

+2

刪除'return'語句。 – 2013-03-12 20:32:04

+1

@AlexChamberlain:爲什麼?! 'return'不在'loop'裏面。 – deepmax 2013-03-12 20:33:23

+0

@MM。這就是爲什麼你應該總是使用'{}'! – 2013-03-12 21:08:03

回答

1

取而代之的是:

while(!input.fail()) 
getline(input, flow); 
flag(flow, 10); 
flag(flow, 20); 
cut(flow, 20); 
cut(flow, 3); 

你可能想這一點:

while(getline(input, flow)) { 
    flag(flow, 10); 
    flag(flow, 20); 
    cut(flow, 20); 
    cut(flow, 3); 
} 

除非我誤解你,你想先讀取整個文件,然後撥打flagcut。在這種情況下,你需要追加你讀的字符串:

string data; 
while(getline(input, flow)) data += flow + '\n'; // add the newline character 
                // because getline doesn't save them 

flag(data, 10); 
flag(data, 20); 
cut(data, 20); 
cut(data, 3); 

注意getline覆蓋你傳遞給它的字符串。

此外,while (!input.fail())是一種糟糕的循環條件形式。可能發生的情況是沒有更多的輸入可用,但流仍然未處於失敗狀態。在這種情況下,最後一次迭代將處理無效輸入。

+0

您的第一個解決方案會一次讀取一行,並在每個過程中運行它? – user2162690 2013-03-12 20:38:09

+0

@ user2162690是的,正好。 – jrok 2013-03-12 20:38:40

+0

我應該通過第一個過程運行整個.txt文件,然後通過第二個過程運行,等等。這是你的第二個案例嗎? – user2162690 2013-03-12 20:41:58