C ++ перезаписывает текстовый файл при его повторном открытии - PullRequest
0 голосов
/ 19 марта 2012

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

Мне удалось заставить его работать, но моя проблема в том, что, когда я закрываю программу, будет, скажем, 3 экземпляра каждого ответа, но когда я открою программу и добавлю 1 ответ на каждый вопросэто все еще скажет, что у меня есть 3 случая этого ответа.

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

#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 ethnicity\n"<< endl;
cout << "you made it back to the main function and you chose " << politicalAffiliationAnswer << " as your political affiliation\n"<< 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 American\n";
cout << "2. Asian\n";
cout << "3. African American\n";
cout << "4. Hispanic/Latino\n";
cout << "5. Caucasion\n";
cout << "6. Other\n";

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 Conservative\n";
cout << "2. Moderately Conservative\n";
cout << "3. Very Liberal\n";
cout << "4. Moderatly Liberal\n";
cout << "5. Neither\n";
cout << "6. In the Middle\n";

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();
}

Ответы [ 2 ]

2 голосов
/ 20 марта 2012

Ваша проблема - параметры, которые вы не передаете в fstream :: open. Вы должны передать fstream::out | fstream::app в качестве второго параметра.

Также см. fstream :: open reference .

Кроме того, поскольку вы не читаете из файла в main(), вы должны использовать ofstream вместо fstream.

2 голосов
/ 20 марта 2012

открыть файл во второй раз, используя аргумент in.

Так что измените это

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

на это

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

Редактировать: неправильно прочитанный вопрос Я думал, выпытались добавить в файл не читать его.

...