流C ++的多个函数

时间:2016-04-12 20:18:26

标签: c++

#include <fstream>
#include <iostream>
#include <cstdlib>
#include <cctype>

using namespace std;

void whitespace_replace(ifstream& in_stream, ofstream& out_stream);
void digit_replace(ifstream& in_stream, ofstream& out_stream);

int main()
{
    ifstream fin;
    ofstream fout;

    cout << "Begin editing files." << endl;
    fin.open("example.dat");

    if (fin.fail())
    {
        cout << "Input file opening failed.\n";
        exit(1);
    }

    fout.open("example2.dat");

    if (fout.fail())
    {
        cout << "Output file opening failed.\n";
        exit(1);
    }

    whitespace_replace(fin, fout);
    digit_replace(fin, fout);
    fin.close();
    fout.close();
    cout << "End of editing files.\n";
    return 0;
}

用连字符替换空格的功能。

void whitespace_replace(ifstream& in_stream, ofstream& out_stream)
{
    char next;

    do
    {
        in_stream.get(next);

        if (isdigit(next))
            out_stream << '#';
        else
            out_stream << next;
    } while (next != '.');
}

使用&#39;#&#39;

替换数字的功能
void digit_replace(ifstream& in_stream, ofstream& out_stream)
{
    char voip;
    do
    {
        in_stream.get(voip);

        if (isspace(voip))
            out_stream << "-";
        else
            out_stream << "-";
    } while (voip != '.');
}

它不允许我运行两个函数来将.dat文件中的数字更改为&#39;#&#39;并用&#39; - &#39;替换所有空格。我该怎么做才能使这些功能发挥作用?

2 个答案:

答案 0 :(得分:1)

随后的

调用
whitespace_replace(fin, fout);
digit_replace(fin, fout);

肯定看不到finfout的相同流状态。

您必须将这些操作组合到单个解析器/决策层次结构中,以便从特定状态的输入转换。

答案 1 :(得分:0)

从第一个函数返回后,当您将它们传递给第二个函数时,finfout的状态将不同,并且在您的情况下将流返回到开始,在调用第二个函数之前,将无法完成您尝试执行的操作,因为它将撤消您写入输出的内容。如果要从一个文件中读取数据,处理数据并将结果直接输出到另一个文件,则可能需要将两个函数组合在一起。否则,您需要首先从输入文件中读取数据,将其放入变量中,然后调用各个函数来处理该数据并将处理后的数据写入输出文件。

一种类似于你的方法可能是将两个函数的逻辑组合在一个函数中调用这个函数:

char next;
in_stream.get(next);
if (isspace(next))
    out_stream << "-";//if space replace with '-'
else if (isdigit(next))
    out_stream << "#";//if digit replace with '#'..
else
    out_stream << next;