Простой вопрос ввода-вывода noob (C ++) - PullRequest
2 голосов
/ 08 июля 2010

извините за вопрос noob, но я новичок в C ++.

Мне нужно построчно прочитать некоторую информацию из файла, выполнить некоторые вычисления и вывести их в другой файл. Например, мы читаем уникальный идентификатор для каждой строки, имя и 2 числа. Последние 2 цифры умножаются, а в выходном файле идентификатор, имя и продукт печатаются построчно:

input.txt:

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

output.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 несколько раз, затем закрою программу. Может кто-нибудь предложить исправление для моего кода выше, чтобы он сделал задачу без ввода с клавиатуры? Спасибо!

Ответы [ 5 ]

9 голосов
/ 08 июля 2010

Используйте

while (!cin.eof()) {
7 голосов
/ 08 июля 2010
using namespace std;

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

Вы скрыли настоящие std :: cin и std :: cout ... и позже прочитаете их.

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

Но здесь вы используете настоящий std :: cin для проверки EOF.

6 голосов
/ 08 июля 2010

Вызов getchar() reads ждет, пока вы наберете символ (и нажмите Enter), так как он читает из stdin (стандартный ввод).Попробуйте изменить условие цикла, чтобы остановить чтение, когда cin достигает конца файла.

EDIT Вы также должны использовать разные имена для входных и выходных потоков - уже есть cin иcout в пространстве имен std.

1 голос
/ 08 июля 2010

Это потому, что вы использовали getchar () в вашем цикле while.Не уверен, что вы пытались сделать, но getchar () читает символ из stdin.То, что вы должны были сделать, это проверить, не удалось ли cin или встретился с EOF.

0 голосов
/ 09 июля 2010

Пока я искал ответ, мне лучше проверить и убедиться, что он работает.Я получил некоторые ошибки при сборке и немного увлекся.

Надеюсь, это поможет!

#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;
}
...