У меня есть программа, которая берет данные из входного файла и форматирует их, чтобы их можно было распечатать в выходной файл, поэтому, например, для ввода у меня есть что-то вроде этого, которое должно быть помещено в формат таблицы в моем выводефайл.У меня во входном файле несколько строк, подобных этой, все идентичные формату такого типа.
Homer Simpson 642084 100 99 20 5 15 77
Моя проблема связана с 6-значным числом сразу после имени.По какой-то странной причине моя программа не печатает это число правильно после определенного момента.
Вот то, что я считаю соответствующим кодом.Это все еще WIP:
#include <iostream>
#include <cstring>
#include <cctype>
#include <fstream>
#include <iomanip>
#include <cstdlib>
using namespace std;
int dropped(int[]);
float avg(int[],int);
float avg_not_six(int[], float);
char give_grade(float);
int main() {
char first_name[11];
char last_name[13];
char lettergrade;
char I_D[7];
char score [6];
int nscore[5];
float grade_avg;
int lowest;
float gradechk=0.0;
ifstream inputfile;
ofstream outputfile;
inputfile.open("student_input.dat");
outputfile.open("student_results.dat");
//Error checking
if (!inputfile)
{
cout<<"Error: Incorrect input file"<<endl;
}
// table formatting
outputfile<<"Last"<<right<<setw(8)<<"First"
<<right<<setw(8)<<"ID"<<right<<setw(10)<<"Average"
<<right<<setw(8)<<"Grade"<<endl;
outputfile<<endl;
while (!inputfile.eof()) {
//continues to grab until end of file is reached
inputfile.getline(first_name, 10, ' ');
inputfile.getline(last_name, 12, ' ');
inputfile.getline(I_D, 7, ' ');
inputfile.getline(score, 20);
//converts scorees to ints and stores in array nscore
nscore[0]=atoi(score);
nscore[1]=atoi(score+3);
nscore[2]=atoi(score+5);
nscore[3]=atoi(score+8);
nscore[4]=atoi(score+11);
nscore[5]=atoi(score+14);
//Finds lowest grade to be dropped
lowest = dropped(nscore);
// Detects missing grades and issues warning
for (int i =0; i<=5; i++) {
if (nscore[i]==0)
{
gradechk++;
cout<<"Warning: Less than six grades are present"<<endl;
grade_avg=avg_not_six(nscore,gradechk);
}
else
grade_avg = avg(nscore, lowest);
// If grade is negative, close program
if (nscore[i]<0) {
cout<<"Error: Negitive grade present"<<endl;;
return 0;
}
}
lettergrade=give_grade(grade_avg);
//Reset counter
gradechk=0;
}
inputfile.close();
outputfile.close();
return 0;
}
Всякий раз, когда я проверяю, чтобы убедиться, что 6-значное число захватывается сразу после того, как я использую getline на нем (третий вниз), печатая на экран, кажется,Работа.Однако всякий раз, когда я решаю сказать ему напечатать это число где-то еще в коде, он печатает это вместо этого.Имейте в виду, что у меня есть несколько строк во входном файле.
76 93 9A 98
Из того, что я могу сказать, это фрагменты данных из разных строк.Я, честно говоря, понятия не имею, почему это происходит.Если это помогает, мне необходимо использовать библиотеку cstring и использовать такие функции, как atoi
и getline
.Если кто-нибудь и укажет мне правильное направление, это будет с благодарностью.