2010-07-08 3 views
2

Извините за вопрос noob, но я новичок в C++.Простой вопрос ввода/вывода 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 несколько раз, а затем закройте программу. Может ли кто-нибудь предложить исправление для моего кода выше, чтобы он выполнял задачу без ввода клавиатуры? Благодаря!

+2

Измените cin/cout на что-то еще. Очень сложно читать и создавать проблемы. –

+2

В качестве условного обозначения 'cin' и' cout' определены в заголовке '' для обозначения 'stdin' и' stdout'. Если вы хотите использовать файлы для ввода и вывода, используйте возможности перенаправления консоли: 'app < input.txt > output.txt'. Теперь ваше приложение может использовать разные входные и выходные файлы без перекомпиляции. – Eclipse

ответ

9

Использование

while (!cin.eof()) { 
+0

Спасибо ... был участником cin, не понимал .eof() существует ... – Zach

+0

u r welcome :-) – jdehaan

+1

не так, используйте 'while (cin >> someChar)'. Это лучше, поскольку он проверяет каждый флаг ошибки. И не используйте повторно 'std :: cin', создайте свой собственный' std :: istream' – rubenvb

6

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

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

7
using namespace std; 

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

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

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

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

1

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

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