【问题标题】:Combining three text files into one text file forming a sentence C++将三个文本文件组合成一个文本文件形成一个句子 C++
【发布时间】:2015-07-11 19:16:42
【问题描述】:

我正在尝试使用 Microsoft Visual Studio 2013 在 C++ 中创建一个程序。该程序的主要目的是读取三个不同的文件(标题 1、标题 2 和标题 3)并将它们放在一起形成一个文件并创建该输出文件中的一个句子。我想出了一个我可以使用的函数,但这个函数只读取并打印 3 个文件到控制台窗口。当我尝试将cout 语句更改为一个输出文件时,我创建的输出文件是空白的......我不知道该做什么或如何构造代码。

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

    using namespace std;

    void readingFile(string[], ifstream &); //Funtion Prototype
    int main()
    {
    string header1[50], header2[50], header3[50]; //Declaring array with 50 elements

    int size1, size2, size3;

    ifstream Fin, Fin2, Fin3;
    ofstream Fout;

    Fin.open("Headlines1.txt");   //Reading from these 3 files.
    Fin2.open("Headlines2.txt");
    Fin3.open("Headlines3.txt");
    if (!Fin || !Fin2 || !Fin3)    //Checking for unsuccessful open
    {
        cout << "Input file opening failed.\n";
        cin.ignore();
        return 1;
    }

    Fout.open("testingHeadlines.txt");  //Used for unsuccessful opening output
    if (!Fout)
    {
        cout << "Output file opening failed.\n";
        cin.ignore();
        return 2;
    }

    cout << "Building.... Editing....\n" << endl;
    cin.ignore();

    cout << "Headlines file 1 below:\n" << endl;
    readingFile(header1, Fin);  //Function call
    cout << endl << endl;
    cout << "Headlines file 2 below:\n" << endl;
    readingFile(header2, Fin2); //Function call
    cout << endl << endl;
    cout << "Headlines file 3 below:\n" << endl;
    readingFile(header3, Fin3); //Function call
    cout << endl << endl;

    cin.ignore();
    return 0;
    }

    //the function 'readingFile' 
    //Pre-conditions: Reads the contents from the files of Headlines1,2,and 3
    //Post-conditions: Prints out the contents.
    void readingFile(string[], ifstream &infile)
    {   
    char next;
    infile.get(next);
        while (!infile.eof())  //Reading until EndOfFile
        {
            cout << next;    //Problem is here?? I would think.
            infile.get(next);
        }
     } 

我只是不确定我是否在哪里说“问题就在这里??”是问题所在。每次我将 cout 更改为 outfile(我知道,我必须更改函数头中的参数)时,一旦打开 outfile 并且文件是空白的。

所有文件都包含随机的单词/短语,放在一起会组成一个句子。例如。 Headlines1 包含 '***Queen Jennifer*'** Headlines2 包含 '***有脑部手术*'** Headlines3 包含 '***在进食后30 颗墨西哥胡椒。*'** 和当放在一起时应该是'詹妮弗女王在吃了 30 颗墨西哥胡椒后做了脑部手术。' 但文件包含更多单词/ 我刚刚在示例中列出的短语。

当我运行上面的程序时,我能够读取所有三个标题文件,但它们是以从上到下的形式打印的。例如,我在控制台屏幕上的输出将是:

女王

詹妮弗

做过脑部手术

吃了 30 颗墨西哥胡椒后

问题: 让我的标题从左到右阅读。

将它们放入输出文件而不是控制台屏幕。

请帮忙。

【问题讨论】:

  • system("cat file1 file2 file3");
  • 除了在这段代码中使用Fout文件时打开它吗?

标签: c++ arrays visual-studio function computer-science


【解决方案1】:

你可以替换这个...

void readingFile(string[], ifstream &infile)
{   
    char next;
    infile.get(next);
    while (!infile.eof())  //Reading until EndOfFile
    {
        cout << next;    //Problem is here?? I would think.
        infile.get(next);
    }
} 

...以及对其的调用,例如...

readingFile(header1, Fin);

...用这个...

void readingFile(ifstream& infile, ofstream& fout)
{   
    char next;
    while (infile.get(next))  //Reading until EndOfFile or error
        if (next != '\n') // if not newline
           fout << next;    // stream to file
} 

...然后叫ala...

readingFile(Fin, Fout);

这样readingFile 被告知在哪里写入输出,并过滤掉导致输出出现在不同行上的换行符。

【讨论】:

  • 是的!这行得通!太感谢了!但我目前遇到了另一个问题。文件中的全部内容现在都在一行上,就像我想要的那样,但它都在一行上。我怎么能做到“詹妮弗女王”的地步
  • @CesarEscobar:看起来你的句子被截断了......我猜你想用一个额外的空格替换换行符......只需在fout &lt;&lt; next;之后添加一个else fout &lt;&lt; ' ';
【解决方案2】:

这应该可以解决问题。

#include <fstream>
#include <string>

int main() {
    // Open the three files.
    std::ifstream file_1("Headlines1.txt");
    std::ifstream file_2("Headlines2.txt");
    std::ifstream file_3("Headlines3.txt");

    // Combine into one string.
    std::string content;
    content += std::string(std::istreambuf_iterator<char>(file_1),
        std::istreambuf_iterator<char>());
    content += std::string(std::istreambuf_iterator<char>(file_2),
        std::istreambuf_iterator<char>());
    content += std::string(std::istreambuf_iterator<char>(file_3),
        std::istreambuf_iterator<char>());

    // Output the string into a single file.
    std::ofstream output_file("testingHeadlines.txt");
    output_file << content;
}

我不确定你想对文件之间的间距做些什么,但这对你来说微调这段代码应该不会太难。

【讨论】:

    【解决方案3】:

    你的输出是这样的一个可能的原因是你在infile.get(next) 中使用的std::ifstream::get() 是一种非格式化的读取方法,这意味着它默认不会跳过空格和换行符\n。所以你需要检查next 值是否是这样的换行符:

    if(next == '\n') continue ;

    在传递给cout &lt;&lt; next之前。因此,您将跳过在控制台屏幕中打印换行符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 2018-10-01
      • 2016-05-23
      相关资源
      最近更新 更多