очень простой вопрос C ++ - PullRequest
       5

очень простой вопрос C ++

8 голосов
/ 16 сентября 2010

Я только начал изучать c ++ сегодня, и я довольно ошеломлен.Это удивительный язык, но у меня возникли некоторые проблемы при перезаписи файлаочень странные цифры.Кто-нибудь знает почему?

    inStream >> annual;
    inStream.close();
    double monthly = (annual/12);

    annualIncrease = ((annual/100)*payIncrease);

    monthlyIncrease = ((monthly/100)*payIncrease);


    newMonthly = (monthly + monthlyIncrease);
    newAnnual = (annual + annualIncrease);




    outStream <<"annual salary was: "<<  annual << "\n" ;  
    outStream <<"new annual salary is " << newAnnual << "\n ";
    outStream <<"new monthly salary is " << newMonthly <<"\n ";



    outStream.close();
    return 0;

}

Я знаю, что это очень низкий уровень квалификации, но я только учусь.

Ответы [ 3 ]

9 голосов
/ 16 сентября 2010

Вы не можете открыть один и тот же файл одновременно с istream и ostream. Поскольку вы закрываете istream довольно рано, почему бы просто не сделать открытый вызов ostream после закрытия istream? В качестве альтернативы вы можете использовать fstream, который разрешает чтение и запись.

6 голосов
/ 16 сентября 2010

Классы потока (ну, технически в данном случае класс basic_filebuf) кэшируют операции чтения и записи в этот файл. Различные файловые потоки не гарантируются для синхронизации.

Используйте один fstream вместо двух отдельных потоков в файле.

2 голосов
/ 16 сентября 2010

Это потому, что по умолчанию открытый параметр для ofstream - ios::out, который уничтожает содержимое файла. Это оставляет ваш объект inStream, считывающий мусор, в годовую переменную, потому что он указывает на тот же файл, содержимое которого было уничтожено. Отсюда твои странные цифры.

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

Чтобы показать, что то, что вы делаете, уничтожает файл:

#include <fstream>

using namespace std;
int main()
{
    ofstream x;
    x.open("ofTest.txt");
    x.close();
    return 1;
}

%> g++ test.cpp
%> cat ofTest.txt
Test file destruction
Test 1,2,3
%> ./a.out
%> cat ofTest.txt
%>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...