使用ofstream

时间:2015-07-22 17:40:45

标签: c++ fstream ofstream

现在我的问题似乎集中在saveFile函数上。

我会在这里发布整个程序,所以当看到一大堆代码时不要再烦恼...只看底部的saveFile函数...我发布所有代码JUST IN CASE它会帮助你帮我解决问题。

现在为大家定义明显的问题:我可以在运行控制台应用程序的整个生命周期中使用updateSale函数编辑文件,但是当我使用saveFile函数并输入' y&# 39;要保存,使用updateSales函数后可见的差异请勿保存到名为" salespeople.txt"的实际销售文件中。我不明白为什么。

这就是salespeople.txt的样子: Schrute 25000

Halpert 20000

万斯19000

哈德森17995.5

Bernard 14501.5

现在这是程序:

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>


using namespace std;
//variables--------------------------------------------------------


int lineCount = 0;
//prototypes-------------------------------------------------------
int getIndexLargest(string[], double[]);
void displaySalesPeople(string[], double[]);
bool readSalesFile(string[], double[]);
void updateSales(string[], double[]);
int saveFile(string, string[], double[], int);

int main()
{
    string fileName;
    int arrayLength;
    ifstream readSales;
    string salesPersonName[5];
    double saleAmount[5];


    bool flag = false;

    int options;
    do
    {

        cout << "1) Open sales person file. "<< endl;
        cout << "2) Display sales person information. "<< endl;
        cout << "3) Update sales. " << endl;
        cout << "4) Get best sales person. " << endl;
        cout << "5) Exit. " << endl;

        cout << "Please enter a number 1-5 to select an option." <<endl;
        cin >> options;


        if(options == 1)
        {
            flag = readSalesFile(salesPersonName, saleAmount);

        }
        else if(options == 2)
        {
            if(flag == false)
            {
                cout << "Please open sales file before selecting this option. Try again" << endl;
            }
            else
                displaySalesPeople(salesPersonName, saleAmount);

        }
        else if(options == 3)
        {
            if(flag == false)
            {
                cout << "Please open sales file before selecting this option. Try again" << endl;
            }
            else
                updateSales(salesPersonName, saleAmount);
        }
        else if(options == 4)
        {
            if(flag == false)
            {
                cout << "Please open sales file before selecting this option. Try again" << endl;
            }
            getIndexLargest(salesPersonName, saleAmount);
        }
        else if(options == 5)
        {

            char choice;
            cout << "Enter character y to save... anything else will exit without saving: " << endl;
            cin >> choice;
            if(choice == 'y')
            {

                saveFile(fileName, salesPersonName, saleAmount, arrayLength);
                cout << "File saved. " << endl;
            }
            else
            {
                cout << "closing program" << endl;
            }
        }
    }
    while(options != 5);
    return 0;

}


//functions---------------------------------
bool readSalesFile(string salesPersonName[], double saleAmount[])
{
    bool flag = false;
    ifstream readSales;

    string fileName;

    cout << "Please enter the path to your sales people file: ";
    getline(cin, fileName);
    readSales.open(fileName.c_str());

    while(readSales.fail())
    {
        cout << "Failed. Please enter the path to your sales file again: ";
        getline(cin, fileName);
        readSales.open(fileName.c_str());
    }
    if(readSales.good())
    {

        flag = true;
        cout << lineCount;

        string name = " ";
        double amount =0.00;
        int i = 0;
        while(!readSales.eof())
        {
            readSales >> name;
            readSales >> amount;
            salesPersonName[i] = name;
            saleAmount[i] = amount;
            i++;

        }
        for(i = 0; i < 5; i++)
        {
            cout << "Sales person name: " << salesPersonName[i] << endl;
            cout << "Sale amount: $" << saleAmount[i] << endl;
     }

     readSales.close();
    }







    readSales.close();
    return flag;
}

void displaySalesPeople(string salesPersonName[], double saleAmount[])
{

    for(int i = 0; i < 5; i++)
    {
        cout << "Sales person name: " << salesPersonName[i] << endl;
        cout << "Sale amount: $" << saleAmount[i] << endl;
    }

}
void updateSales(string salesPersonName[], double saleAmount[])
{
    bool flag = false;

    string findName;
    double moneyAmount;

    cout << "Enter name of sales person you want to modify: " << endl;
    cin >> findName;

    for(int i = 0; i < 5; i++)
    {
        if(findName == salesPersonName[i])
        {
            cout << "Enter the sale amount you would like to modify: " << endl;
            cin >> moneyAmount;
            saleAmount[i] += moneyAmount;
            cout << saleAmount[i] << endl;

            flag = true;
        }


    }
    if(flag == false)
    {
        cout << " name not found" << endl;
    }

}

int getIndexLargest(string salesPersonName[], double saleAmount[])
{
    ifstream readSales;
    while(!readSales.eof())
    {
        double largestSale = 0.00;
        string largestSalesPerson;
        int i = 0;



        lineCount++;
        readSales >> salesPersonName[i];
        readSales >> saleAmount[i];
        if(saleAmount[i] > largestSale)
        {
            largestSale = saleAmount[i];
            largestSalesPerson = salesPersonName[i];
        }
        cout << "Best sales person : "<< largestSalesPerson << " $" <<setprecision(2)<<fixed<< largestSale << endl;

    }
}
int saveFile(string fileName, string salesPersonName[], double saleAmount[], int arrayLength)
{

    ofstream saveFile(fileName.c_str());

    saveFile.open(fileName.c_str());

    for(int i = 0; i < 5; i++)
    {
        saveFile << salesPersonName[i] << " " << saleAmount[i] << endl;
    }

    saveFile.close();
    return 0;
}

1 个答案:

答案 0 :(得分:2)

您试图打开文件两次:

ofstream saveFile(fileName.c_str()); // this opens the file

saveFile.open(fileName.c_str()); // so does this

这会使文件处于错误状态,因此不会发生写入。

这样做:

ofstream saveFile(fileName.c_str()); // this opens the file

这应该有效。

或者你可以这样做:

ofstream saveFile; // this does not open the file

saveFile.open(fileName.c_str()); // but this does

这也应该有效。