Member 14982907 Ответов: 3

Это мой код C++ по обработке файловой системы наряду с функциями и структурами


По какой-то причине моя линия getline не будет работать, и моя функция PintScore не будет работать.
Любая помощь будет оценена по достоинству, так как я хочу исправить и понять, почему это не работает.



Что я уже пробовал:

#include <iostream> //library for input output stream
#include <fstream> //library for reading and writing files
#include <assert.h> //for the assert function
using namespace std;

struct Components //Components variable has all the variables relating to the Component of the Quiz
{
    string name,done;
    int score;
    char ans1,ans2,ans3,ans4,ans5,ans6;
    ofstream fout;
};

void GetInfo(Components &variables);
void PrintScore(Components &variables);
void AnswerSheet(Components &variables);

int main()
{
    cout<<"Hello user,this code is meant to Quiz you on multiple choice questions and then grade your answers."<<endl;
    char Continue;
    do{
    Components variables;
    GetInfo(variables);
    PrintScore(variables);
    AnswerSheet(variables);
    cout<<"............................................................................";
    cout<<"\nDo you wish to take this quiz again? If so, please enter in y or Y otherwise press any other key: ";
    cin>>Continue;
    }while(Continue == 'y' || Continue == 'Y');
}

void GetInfo(Components &variables)
{
    variables.fout.open("Quiz.txt", ios::out);
    assert(!variables.fout.fail());
    cout<<"Okay user, please enter in your first and last name: ";
    getline(variables.name);
    //cin>>variables.name;

    cout<<"............................................................................"<<endl;
    cout<<"1: When working with multiple files (at the same time), the stream variables"<<endl;
    cout<<"\na. must all be of the same type, such as all ifstream, or all ofstream.";
    cout<<"\nb. must each be named independently, such as fin1, fin2, or fout1, fout2.";
    cout<<"\nc. must all be named the same, such as all fin and/or fout.";
    cout<<"\nd. are not needed since multiple files are present.";
    cout<<"\nANSWER: "<<endl;
    cin>>variables.ans1;

    cout<<"............................................................................";
    cout<<"\n2: The required header file that allows classes of ofstream and ifstream to become available is"<<endl;
    cout<<"\na. iostream";
    cout<<"\nb. filestream";
    cout<<"\nc. assert.h";
    cout<<"\nand. fstream";
    cout<<"\nANSWER: "<<endl;
    cin>>variables.ans2;

    cout<<"............................................................................";
    cout<<"\n3: When creating a new file, if a file of the same name already exists,"<<endl;
    cout<<"\nthe system will inform you that that file name is already in use.";
    cout<<"\na. true";
    cout<<"\nb. false";
    cout<<"\nANSWER: "<<endl;
    cin>>variables.ans3;

    cout<<"............................................................................";
    cout<<"\n4: In the statement: fin.open(\"myfile.dat\", ios::in); the ios::in is the"<<endl;
    cout<<"\na. stream variable name";
    cout<<"\nb. name of the file";
    cout<<"\nc. stream operation mode";
    cout<<"\nd. name of the buffer";
    cout<<"\nANSWER: "<<endl;
    cin>>variables.ans4;

    cout<<"............................................................................";
    cout<<"\n5: What is the purpose of this line of code? Be specific."<<endl;
    cout<<"\nfout.open(\"name.dat\",ios::app);";
    cout<<"\na. Open a brand new binary file.";
    cout<<"\nb. Append the file";
    cout<<"\nc. ios::app is a new file";
    cout<<"\nd. Delete the file";
    cout<<"\nANSWER: "<<endl;
    cin>>variables.ans5;
    cout<<"............................................................................";

        if(variables.ans1 == 'b' || variables.ans1 == 'B'){
        variables.score++;
        }if(variables.ans2 == 'd' || variables.ans2 == 'D'){
        variables.score++;
        }if(variables.ans3 == 'b' || variables.ans3 == 'B'){
        variables.score++;
        }if(variables.ans4 == 'c' || variables.ans4 == 'C'){
        variables.score++;
        }if(variables.ans5 == 'b' || variables.ans5 == 'B'){
        variables.score++;
        }
        cout<<endl;
    variables.fout.close();
}

void PrintScore(Components &variables)
{
    ifstream fin;
    fin.open("Quiz.txt", ios::in);
    if(fin.fail())
    {
        cout<<"Error, please check your code.";
    }
    else
    {
        string read;
        //int TotalScore = variables.score;
        while(fin>>read)
        {
            cout<<read;
            cout<<"\nOkay, "<<variables.name<<", your score is "<<variables.score<<"/5"<<endl;
        }
    }
    cout<<"Your Quiz has now officially been completed!"<<endl;
    cout<<"............................................................................"<<endl;
    fin.close();
}

void AnswerSheet(Components &variables)
{
    variables.fout.open("AnswerSheet.txt", ios::in);
    cout<<"\nThis is the file that has all the answers to your quiz and because you have finished it you can now see the answers."<<endl;
    cout<<"\nThe answer to Question 1 is 'b'";
    cout<<"\nThe answer to Question 2 is 'd'";
    cout<<"\nThe answer to Question 3 is 'b'";
    cout<<"\nThe answer to Question 4 is 'c'";
    cout<<"\nThe answer to Question 5 is 'b'"<<endl;
    variables.fout.close();
}

3 Ответов

Рейтинг:
27

Patrice T

Цитата:
По какой-то причине моя линия getline не будет работать, и моя функция PintScore не будет работать.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Member 14982907

О да, я слышал об отладчиках, но никогда не знал, как их использовать. Спасибо за помощь, Патрис ти!

Рейтинг:
14

Rick York

Этот код вообще компилируется? - Спрашиваю я, потому что мне кажется, что нет. Видеть это : getline (string) - ссылка на C++ [^]


Member 14982907

Без getline statemnet он действительно компилируется, я знал, что это был Вонг, но это то, чему меня научил мой учитель, он не очень хороший учитель, что затрудняет изучение чего-либо, но на этом сайте есть такие люди, как вы, которые очень помогают.

Рейтинг:
12

OriginalGriff

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

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а он удваивает его и печатает ответ, то если ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!


Member 14982907

":laugh 😂" да я знаю, что знаю и помощь очень сильно оценена OriginalGriff, вы всегда можете проанализировать мой код и дать полезную обратную связь, которая помогает мне в моей работе. Спасибо за это, йо.

OriginalGriff

Всегда пожалуйста!