(C ++)在将数组内容写入文件时遇到问题

时间:2017-07-31 22:59:41

标签: c++ arrays ofstream

学校作业。必须基本上为驾驶员考试创建测试密钥,然后验证学生是否通过了考试。正确答案将存储在一个数组中,学生答案和全名将存储在用户输入的另一个数组中,并写入文本文件。

有一段时间我以为我正在做的事情是正确的,直到我去运行程序并注意到无论数组的长度有多长,它都会写出一个奇怪的I字符,上面有一个重音。它还将数组的正确答案写入我不想做的文件中。我需要写的所有文件是:(全名,学生答案(20),全名,学生答案(20)等。)

由于某种原因,文件的第一个字母也被切断了。 (例如......" John Doe"成为" ohn Doe")这个错误的原因是什么?没有cin.ignore()语句我不知道如何在文件中获取我需要的全名。

我已将顶部的数组大小设置为常量,允许我将其更改为4个空格而不是20个,以便进行快速测试。

感谢任何帮助。非常新的编程。到目前为止,享受它有时会很困难。

我的代码:

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

void Correct_Answers(const int SIZE, char correctAnswers[]);
void Submitted_Answers(const int SIZE, char submittedAnswers[]);
void Get_Name(string &fullName);



int main()
{
    const int SIZE = 4;
    char correctAnswers[SIZE];
    char submittedAnswers[SIZE];
    string fileName;
    string fullName;
    char go = 'Y';
    ofstream outputObj;

    Correct_Answers(SIZE, correctAnswers);

    cout << "\nEnter the file name: ";
    cin.ignore();
    getline(cin, fileName);
    outputObj.open(fileName);


    while (go == 'Y' || go == 'y')
    {
        Get_Name(fullName);
        outputObj << fullName << endl;

        Submitted_Answers(SIZE, submittedAnswers);
        outputObj << submittedAnswers << endl;

        cout << "\nTo process another user enter Y. To quit enter N: ";
        cin >> go;
    }


    cout << "\n\n\n";
    system("Pause");
    return(0);
}

void Correct_Answers(const int SIZE, char correctAnswers[])
{
    int questionCounter = 0;

    cout << "\nEnter the correct answers for the drivers exam.\n";

    for (int x = 0; x < SIZE; x++)
    {
        cout << "\tQuestion #" << ++questionCounter << ": ";
        cin >> correctAnswers[x];
        while (correctAnswers[x] != 'A' && correctAnswers[x] != 'a' && correctAnswers[x] != 'B' && correctAnswers[x] != 'b' && correctAnswers[x] != 'C' && correctAnswers[x] != 'c' && correctAnswers[x] != 'D' && correctAnswers[x] != 'd' )
        {
            cout << "\tInvalid entry. Re-enter answer: ";
            cin >> correctAnswers[x];
        }
    }
}

void Submitted_Answers(const int SIZE, char submittedAnswers[])
{
    int questionCounter = 0;

    cout << "\nWelcome to the written portion of the drivers exam!";
    cout << "\nDo your best to answer the questions to the best of your knowledge.";
    cout << "\n15 out of 20 are needed to pass the exam. Best of luck!\n\n";

    for (int x = 0; x < SIZE; x++)
    {
        cout << "\tQuestion #" << ++questionCounter << ": ";
        cin >> submittedAnswers[x];
        while (submittedAnswers[x] != 'A' && submittedAnswers[x] != 'a' && submittedAnswers[x] != 'B' && submittedAnswers[x] != 'b' && submittedAnswers[x] != 'C' && submittedAnswers[x] != 'c' && submittedAnswers[x] != 'D' && submittedAnswers[x] != 'd')
        {
            cout << "\tInvalid. Re-enter answer: ";
            cin >> submittedAnswers[x];
        }

    }

}

void Get_Name(string &fullName)
{
    cout << "\nEnter the users name: ";
    cin.ignore();
    getline(cin, fullName);
}

1 个答案:

答案 0 :(得分:0)

当您写入文件时,您收到垃圾邮件的原因是当您使用&gt;&gt;时文件的运算符,ofstream对象,你实际上是在传递一个指针,它只是一直在读取字符,直到它找到行尾或空格。例如:

int main()
{
    char submittedAnswers[4] = { 'a', 'b', 'c', 'd' };
    char * memptr = submittedAnswers; // Points to "abcdÌÌÌ̤ònÉÈø+="
    ofstream outputObj ("d:/filetest.txt");

    outputObj << submittedAnswers << endl;
}

这就是为什么它会将垃圾打印到文件中。

你失去“John Doe”第一个字母的原因是因为你这样做:

cin.ignore(); // This discards the first character.
getline(cin, fullName);

那你为什么要做cin.ignore()?因为您认为必须在读取行之前添加cin.ignore()才能使其工作:

cout << "\nEnter the file name: ";
cin.ignore(); // You've added this because otherwise getline(cin, fileName)
              // ends up empty
getline(cin, fileName);
outputObj.open(fileName);

如果省略cin.ignore(),为什么getline()会返回一个空字符串?因为在调用它时,cin缓冲区中仍然有一个'\ n'换行符。

当你接受答案时:

cin >> correctAnswers[x]; 

在一个循环中。每当该行执行时,默认情况下会跳过空格和新行。当您输入答案时,键入内容然后按Enter键。按Enter键时,它会在缓冲区中添加'\ n'。所以命令行输入被插入到correctAnswers []中,但最后一个cin&gt;&gt;你最后得到一个'\ n'字符,这就是为什么你必须在调用getline()之前调用cin.ignore,在缓冲区中跳过这个'\ n'字符。