2

抱歉这个菜鸟问题,但我是 C++ 新手。

我需要从文件中逐行读取一些信息,并执行一些计算,然后输出到另一个文件中。例如,我们为每一行读取一个唯一 ID、一个名称和 2 个数字。最后 2 个数字相乘,在输出文件中,ID、名称和产品逐行打印:

输入.txt:

2431 John Doe 2000 5
9856 Jane Doe 1800 2 
4029 Jack Siu 3000 10

输出.txt:

  ID     Name Total
2431 John Doe 10000
9856 Jane Doe 3600
4029 Jack Siu 30000

我的代码与此类似,但只有第一行出现在输出文件中。如果我Enter反复按,其他行会出现在输出文件中:

#include <fstream>
using namespace std;

ifstream cin("input.txt");
ofstream cout("output.txt");

int main () {

    int ID, I, J;
    string First, Last;
    char c;

    cout << "ID\tName\t\Total\n";

    while ((c = getchar()) != EOF) {
        cin >> ID >> First >> Last >> I >> J;
        cout << ID << " " << First << " " << Last << " " I * J << "\n";
    }

    return 0;
}

这是我唯一的问题,这些值不会出现在输出文件中,除非我Enter反复按,然后关闭程序。任何人都可以建议修复我上面的代码,让它在没有键盘输入的情况下完成任务吗?谢谢!

4

5 回答 5

9

采用

while (!cin.eof()) {
于 2010-07-08T19:46:42.907 回答
7
using namespace std;

ifstream cin("input.txt");
ofstream cout("output.txt");

您已经隐藏了真正的 std::cin 和 std::cout ......稍后将从它们中读取。

while ((c = getchar()) != EOF) {

但是在这里你使用真正的 std::cin 来检查 EOF。

于 2010-07-08T19:45:23.517 回答
6

getchar()调用 reads 等待您输入一个字符(然后按 Enter),因为它从标准输入(标准输入)读取。cin尝试更改循环条件以在到达文件末尾时停止读取。

编辑 您还应该为输入和输出流使用不同的名称——命名空间中已经存在cin和。coutstd

于 2010-07-08T19:44:03.363 回答
1

这是因为您在 while 循环条件中使用了 getchar()。不确定您要做什么,但 getchar() 从标准输入读取一个字符。您应该做的是检查 cin 是否失败或遇到 EOF。

于 2010-07-08T19:45:47.137 回答
0

虽然我正在寻找答案,但我最好检查并确保它有效。我遇到了一些构建错误,并且有点偏离了那里。

希望这可以帮助!

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

int main () {

    ifstream indata("input.txt");
    if(!indata)
    { // file couldn't be opened
        cerr << "Error: input.txt could not be opened" << endl;
        exit(1);
    }

    ofstream output("output.txt");
    if(!output)
    { // file couldn't be opened
        cerr << "Error: output.txt could not be opened" << endl;
        exit(1);
    }

    int ID, I, J;
    char First[10], Last[10];

    output << "ID\tName\tTotal\n";
    while (!indata.eof()) 
    {
        indata >> ID >> First >> Last >> I >> J;
        output << ID << " " << First << " " << Last << " " << I * J << endl;
    }

    indata.close();
    output.close();

    return 0;
}
于 2010-07-08T20:28:52.243 回答