2017-02-20 30 views
-2

Я пытался решить это какое-то время, и кажется, что все, что я пробовал, сделало его еще хуже. Я разрабатываю программу, которая считывает входной файл, выполняет вычисления и печатает в выходной файл. (Его калькулятор класса). Сейчас я просто пытаюсь заставить его отображать имя и идентификационный номер на выходе для каждой строки на входе.Программа не печатает детали в выходной файл C++

#include <iostream> 
#include <fstream> 
#include <cstring> 
#include <sstream> 

using namespace std; 

float printRecord (char name[20], char Id[20], ostream& outfile) 
{ 
outfile << name << " " << Id << endl; 
return 0; 
} 

int main() 
{ 
ofstream outfile; 
ifstream infile; 

std::string line; 

char file_nameI[21], file_nameO[21], name[20], Id[20]; 

float hworkgrade, grade1; 
int deductions; 

cout << "Please enter name of input file: "; 
cin >> file_nameI; 
infile.open(file_nameI); 
if (!infile) 
{ 
    cout << "Could not open input file \n"; 
    return 0; 
} 

cout << "Please enter name of output file: "; 
cin >> file_nameO; 
infile.open(file_nameO); 
if (!outfile) 
{ 
    cout << "Could not open output file \n"; 
    return 0; 
} 

    while (getline (infile, line)) 
    { 
    istringstream iss(line); 
    iss >> name >> Id; 
    cout<< name << " " << Id; 
    printRecord(name, Id, outfile); 
    cin.ignore(); 
    } 

    return 0; 

    } 

Здесь вход

Truman, Tod 12388671 100 100 100 
Seger,John 67894 100 100 100 100 
Victoire,Susan 938442 0 0 0 
Kodak,James 554668 101 100 100 
Frence,Lauren 602983 -1 100 100 
Hanz, Franz 58027201 100 100 100 
Laufeson,Loki 7920100 34 59 24 

Вот выход:

12388671 
Seger,John 67894 
Victoire,Susan 938442 
Kodak,James 554668 
Frence,Lauren 602983 
58027201 
Laufeson,Loki 7920100 

Он пропускает первым и шестым именем.

Я попытался изменить переменные в строковых переменных, изменяя порядок цикла, устанавливая имя две переменной (первый и последний)

Любая помощь очень ценится

+2

Любая причина, почему вы не используете 'зЬй :: string' в отличие от' символ XYZ [хх] '? – WhiZTiM

+0

закройте свой файл после его написания. – Sedrick

+1

Правильный инструмент для решения таких проблем - ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –

ответ

1

Разница заключается в том, что для эти две строки ввода, у вас есть пробел между именами.

Сравнить

Truman, Tod 12388671 100 100 100 
Seger,John 67894 100 100 100 100 

С istringstream::operator>> читает вплоть до пространства он остановится в этом пространстве при чтении первой строки и получит вторую часть имени во второй строке вместо номера.

Решение делает ваши данные согласованными или допускает наличие или отсутствие пространства при разборе строк.

У вас есть еще одна опечатка, которая сделает ваш примерный код непригодным для использования. Вы никогда не открываете выходной файл. Вы дважды открываете входной файл!

infile.open(file_nameO); =>outfile.open(file_nameO);

Некоторые устроились код

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <string> 

using namespace std; 

void printRecord (const string& name, const string& Id, ostream& outfile) { 
    outfile << name << " " << Id << endl; } 

int main() { 
    string line; 
    string file_nameI, file_nameO; 

    cout << "Please enter name of input file: "; 
    //cin >> file_nameI; 
    file_nameI = "grades.txt"; 
    cout << file_nameI << '\n'; 
    ifstream infile(file_nameI.c_str()); 
    if (!infile) 
    { 
     cout << "Could not open input file \n"; 
     return 0; 
    } 

    cout << "Please enter name of output file: "; 
    //cin >> file_nameO; 
    file_nameO = "gradesout.txt"; 
    cout << file_nameO << '\n'; 

    ofstream outfile(file_nameO.c_str()); 
    if (!outfile) 
    { 
     cout << "Could not open output file \n"; 
     return 0; 
    } 

    while (getline (infile, line)) 
    { 
     string name, id; 
     istringstream iss(line); 
     iss >> name >> id; 
     cout << name << " " << id; 
     printRecord(name, id, outfile); 
     cin.ignore(); 
    } } 
+0

Большое спасибо! Кроме того, причина несогласованности ввода заключается в том, что у меня первоначально было мое имя, и когда я разместил его здесь, я, очевидно, изменил его, но я не дважды проверял. Однако я добавил ваше другое предложение, и теперь мой код работает безупречно! – Morgan

 Смежные вопросы

  • Нет связанных вопросов^_^