2013-10-31 109 views
1

我希望有人能幫我解決我在這裏遇到的問題。我的程序在下面,我遇到的問題是我無法弄清楚如何編寫process()函數以便用一堆隨機數字讀取.txt文件,讀取數字並輸出正面的數字到一個單獨的文件。我已經堅持了幾天,我不知道還有什麼可以轉身的。如果任何人都可以提供任何幫助,我會非常感激,謝謝。從文件流式傳輸數字

/* 
    10/29/13 
    Problem: Write a program which reads a stream of numbers from a file, and writes only the positive ones to a second file. The user enters the names of the input and output files. Use a function named process which is passed the two opened streams, and reads the numbers one at a time, writing only the positive ones to the output. 

*/ 
#include <iostream> 
#include <fstream> 
using namespace std; 

void process(ifstream & in, ofstream & out); 

int main(){ 
    char inName[200], outName[200]; 

    cout << "Enter name including path for the input file: "; 
    cin.getline(inName, 200); 
    cout << "Enter name and path for output file: "; 
    cin.getline(outName, 200); 

    ifstream in(inName); 
    in.open(inName); 
    if(!in.is_open()){ //if NOT in is open, something went wrong 
     cout << "ERROR: failed to open " << inName << " for input" << endl; 
     exit(-1);  // stop the program since there is a problem 
    } 
    ofstream out(outName); 
    out.open(outName); 
    if(!out.is_open()){ // same error checking as above. 
     cout << "ERROR: failed to open " << outName << " for outpt" << endl; 
     exit(-1); 
    } 
    process(in, out); //call function and send filename 

    in.close(); 
    out.close(); 

    return 0; 
} 


void process(ifstream & in, ofstream & out){ 
     char c; 
    while (in >> noskipws >> c){ 
     if(c > 0){ 
      out << c; 
     } 
    } 

    //This is what the function should be doing: 
    //check if files are open 
    // if false , exit 
    // getline data until end of file 
    // Find which numbers in the input file are positive 
    //print to out file 
    //exit 


} 

回答

3

您不應該使用char進行提取。如果要提取的值大於1個字節會怎樣?另外,std::noskipws變爲off跳過空格,實際上很難提取空格分隔的數字列表。如果空白字符是有效的字符以提取,則僅使用std::noskipws,否則讓文件流執行其作業。

如果你知道標準庫很好,可以使用通用的算法,如std::remove_copy_if是採取迭代器像下面的那些:

void process(std::ifstream& in, std::ofstream& out) 
{ 
    std::remove_copy_if(std::istream_iterator<int>(in), 
         std::istream_iterator<int>(), 
         std::ostream_iterator<int>(out, " "), 
              [] (int x) { return x % 2 != 0; }); 
} 

這需要使用C++ 11。將-std=c++11選項添加到您的程序或升級您的編譯器。

如果您不能使用這些方法,那麼至少在提取過程中使用int

int i; 

while (in >> i) 
{ 
    if (i % 2 == 0) 
     out << i; 
} 

你在你的意見,你需要使用getline說。這是錯誤的。我在這裏假設你有多行空格分隔的整數。如果是這種情況,則不需要getline

+0

好的,謝謝你。當我運行程序時,輸入輸入文件的名稱,所需輸出文件的名稱。然後它結束。我去看看輸出文件,它根本沒有任何內容。所以即時通訊仍然不知道該程序有什麼問題。有任何想法嗎? – user2917900

+0

@ user2917900您是否收到任何錯誤?讓我尋找更多的問題。 – 0x499602D2

+0

即時通訊使用Visual Studio 2012.我沒有收到任何錯誤。我正在運行我上面的程序,並進行了更正。我輸入我在該文件中隨機生成的一些正數和負數的輸入文件名,然後輸入所需的輸出文件名。然後,該輸出文件中沒有任何內容(當輸入文件應該有正數時)。 – user2917900