当文本文件再次打开时,C++会覆盖它

C++ overwrites on a text file when it is opened again

本文关键字:C++ 覆盖 文件 文本      更新时间:2023-10-16

这个程序应该打开一个txt文件,记录两个不同问题的答案,关闭文件,然后在一个名为accumulatingFunction的函数中重新打开它,这样每个问题的答案都可以计数。

我已经设法让它发挥作用,但我的问题是,当我关闭程序时,每个答案会有3个实例,但当我打开程序并添加每个问题的1个答案时,它仍然会说我有3个该答案的实例。

我认为这是一个已经存在的答案,我一辈子都想不出如何让它停止。(而且,现在accumulatingFunction只检查每个问题的第一个答案。我想在添加其他问题之前确保这是可能的。或者我想也许你们会有另一种方法来做这件事。)

#include<iostream>
#include<string>
#include<fstream>
using namespace std;
double userInput = 0;
string ethnicityQuestion();
void validationFunction(int);
string politicalQuestion();
void accumulatingFunction();

//-----------------------------------------------------------------------------------------------
int main()
{
    string ethnicityAnswer, politicalAffiliationAnswer, userID;
    fstream answerFile;
answerFile.open("F:\midTermFile.txt");

if (!answerFile)
    cout << "You have a file read error" <<endl;

while (userID != "done")
{
ethnicityAnswer = ethnicityQuestion();
system("cls");
politicalAffiliationAnswer = politicalQuestion();
system("cls");

answerFile << ethnicityAnswer << endl;
answerFile << politicalAffiliationAnswer << endl;
cout << "you made it back to the main function and you chose " << ethnicityAnswer << " as your ethnicityn"<< endl;
cout << "you made it back to the main function and you chose " << politicalAffiliationAnswer << " as your political affiliationn"<< endl;
accumulatingFunction();
cout << "Please enter your user ID:  ";
cin >> userID;
}
answerFile.close();

return 0;
}
//-----------------------------------------------------------------------------------------------
string ethnicityQuestion()
{
    string ethnicity;
    int selection = 6;
string A = "Native_American";
string B = "Asian";
string C = "African American";
string D = "Hispanic/Latino";
string E = "Caucasion";
string F = "Other";
cout << "What ethnicity do you claim?n";
cout << "1. Native Americann";
cout << "2. Asiann";
cout << "3. African Americann";
cout << "4. Hispanic/Latinon";
cout << "5. Caucasionn";
cout << "6. Othern";
validationFunction(selection);

if (userInput == 1)
    ethnicity = A;
else if (userInput == 2)
    ethnicity = B;
else if (userInput == 3)
    ethnicity = C;
else if (userInput == 4)
    ethnicity = D;
else if (userInput == 5)
    ethnicity = E;
else if (userInput == 6)
    ethnicity = F;
return ethnicity;
}
//------------------------------------------------------------------------------------------------
string politicalQuestion()
{
    string affiliation; 
    int selection = 6;
string A = "Very_Conservative";
string B = "Moderately Conservative";
string C = "Very Liberal";
string D = "Moderately Liberal";
string E = "Neither";
string F = "In the Middle";
cout << "On most political issues, which of the following do you associate with most:n";
cout << "1. Very Conservativen";
cout << "2. Moderately Conservativen";
cout << "3. Very Liberaln";
cout << "4. Moderatly Liberaln";
cout << "5. Neithern";
cout << "6. In the Middlen";
validationFunction(selection);

if (userInput == 1)
    affiliation = A;
else if (userInput == 2)
    affiliation = B;
else if (userInput == 3)
    affiliation = C;
else if (userInput == 4)
    affiliation = D;
else if (userInput == 5)
    affiliation = E;
else if (userInput == 6)
    affiliation = F;
return affiliation;
}
//-----------------------------------------------------------------------------------
void validationFunction(int choiceAmount)
{
    while ((!(cin >> userInput)) || (userInput > choiceAmount || userInput < 1))
    {                       
        cin.clear();
        cin.ignore(INT_MAX, 'n');
        cout << "Please enter a number between 1 and 6: ";
    }
}
//------------------------------------------------------------------------------------------------
void accumulatingFunction()
{
    string userAnswer;
    double nativeAmerican = 0, veryConservative = 0;

    ifstream countFile;
    countFile.open("F:\midTermFile.txt");

    while (!countFile.eof()) 
        {countFile >> userAnswer;
            if (userAnswer == "Native_American")
                nativeAmerican += 1;
            else if (userAnswer == "Very_Conservative")
                    veryConservative += 1;
            userAnswer = "";
        }
            cout << nativeAmerican << endl;
            cout << veryConservative << endl;
        countFile.close();
}

您的问题是没有传递给fstream::open的参数。您必须将fstream::out | fstream::app作为第二个参数传递。

另请参阅fstream::open引用。

此外,由于您不是在main()中读取文件,因此应该使用ofstream而不是fstream

使用in参数第二次打开文件。

所以改变这个

countFile.open("F:\midTermFile.txt");

到这个

countFile.open("F:\midTermFile.txt", fstream::in | fstream::app);

编辑:误读问题我以为你是想添加到文件中而不是读取它。