Почему случайные части данных заменяют мои другие данные, которые когда-то хранились в моем массиве символов? - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть программа, которая берет данные из входного файла и форматирует их, чтобы их можно было распечатать в выходной файл, поэтому, например, для ввода у меня есть что-то вроде этого, которое должно быть помещено в формат таблицы в моем выводефайл.У меня во входном файле несколько строк, подобных этой, все идентичные формату такого типа.

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.Если кто-нибудь и укажет мне правильное направление, это будет с благодарностью.

1 Ответ

0 голосов
/ 17 февраля 2019

getline (), которая читает последнее слово строки в вашем случае, читает только до "" (пробел).Затем следующий getline читает до "\ n" (символ новой строки).Из-за чего ваш вклад искажается.Добавьте дополнительную функцию getline () в конце каждой строки, чтобы прочитать символ «\ n».

Попробуйте сделать это

        inputfile.getline(first_name, 10, ' ');
        inputfile.getline(last_name, 12, ' ');
        inputfile.getline(I_D, 7, ' ');
        inputfile.getline(score, 20);
        inputfile.getline(tempStr);
...