C++ чтение/запись txt файла в одной задаче -> обмен символами

Я пытаюсь открыть txt-файл для чтения/записи в одной задаче. Моя предыдущая цель - обменять некоторые символы на сохраненные в массиве:

   void Inputfile::decryptFile(string filename)
{
    for(int i=0;i<15;i++)
    {
        fstream filedest(filename.c_str(), ios::in | ios::out);
        if(!filedest)
            cerr << "Konnte Zieldatei nicht oeffnen!\n";
        else 
            cout << endl << filename << " geoeffnet zum entschluesseln!\n";

        while(!filedest.eof())
        {
            filedest.get(ch);
            if(ch == char(this->mostcharsencrypted[i]))
            {
                filedest.put(char(this->mostchars[i]));
            }

        }
        filedest.close();
        cout << "Fertig!";
    }
}

mostcharsencrypted[] и mostchars[] — это целочисленные массивы, содержащие символы. Я уверен, что есть только 8-битное значение Ansii, и я проверяю это еще до того, как этот метод будет вызван.

Итак, если текущий читаемый символ - это тот, который находится в текущей позиции массива (i: 0 - 14), тогда я хочу обменять символ в txt-файле на символ из mostchars [].

В настоящее время я вижу, что получаю точно такие же совпадения, но мой текстовый файл по-прежнему показывает то же содержимое.


person Stefan    schedule 30.03.2011    source источник
comment
while (!stream.eof()) почти всегда неверно. Кто учит этому дерьму?!   -  person Lightness Races in Orbit    schedule 31.03.2011
comment
Кстати, явные приведения к char, вероятно, не нужны.   -  person Lightness Races in Orbit    schedule 31.03.2011
comment
Лучший способ сделать это в реальном мире — сопоставить файл с памятью, но это выглядит как учебный пример.   -  person Martin Beckett    schedule 31.03.2011
comment
это не настоящее приложение, а просто университетский материал.. во всяком случае, @ tomalak: довольно часто встречается в книгах и в Интернете. Какой метод следует предпочесть? Я делал C в течение нескольких лет и помню, что это также было типично для чтения до EOF-Character. Преобразование в char было еще одной идеей того, почему этого может не произойти. Идея: Stream пытается записать 4 байта целого числа, но может записать только 1 байт из-за .put(), поэтому я привожу к char, чтобы просто дать ему 8 бит.   -  person Stefan    schedule 31.03.2011


Ответы (1)


При замене файла обычно используются два отдельных потока для ввода и вывода по отдельности. Если вам нужно использовать один поток как для ввода, так и для вывода, цикл while будет выглядеть следующим образом:

while(filedest)
{
    streampos p = filedest.tellg();
    if(!filedest.get(ch)) break;
    filedest.seekp(p);
    char ch2 = (ch == char(this->mostcharsencrypted[i])) ?
        char(this->mostchars[i]) : ch;
    filedest.put(ch2);
    filedest.sync();
}
person Ise Wisteria    schedule 31.03.2011
comment
Это приводит к бесконечному циклу, заканчивающемуся в моем файле: TLLLLLLLLLLLLLLLLLLLLLLLLLLL... ‹еще немного L› ничего и все в одной строке. - person Stefan; 31.03.2011
comment
Извините, я не могу понять причину в данный момент. К вашему сведению, приведенный выше код работает на MSVC2005 и MinGW g++3.4.5, когда я тестировал. - person Ise Wisteria; 01.04.2011
comment
Я только что протестировал его с помощью Visual Studi 2010. Возможно, позже у меня будет шанс на gcc 4.4. Но поскольку я не нашел хорошего рабочего решения, я работаю с временным файлом и отдельными входными и выходными потоками. Во всяком случае, часть вашего кода дала мне некоторые подсказки и мысли :) - person Stefan; 01.04.2011