Ввод, вывод и добавление двоичных файлов C ++ - PullRequest
2 голосов
/ 03 июня 2011

Я пытаюсь основной ввод, вывод (и добавление) в C ++, вот мой код

#include <iostream>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;



void escribir(const char *);
void leer(const char *);

int main ()
{
    escribir("example.bin");
    leer("example.bin");
    system("pause");
    return 0;
}

void escribir(const char *archivo)
{
    ofstream file (archivo,ios::app|ios::binary|ios::ate);
    if (file.is_open())
    {
        file<<"hello";
        cout<<"ok"<<endl;
    }
    else
    {
        cout<<"no ok"<<endl;
    }
    file.close();


}

void leer(const char *archivo)
{
    ifstream::pos_type size;
    char * memblock;

    ifstream file (archivo,ios::in|ios::binary|ios::ate);
    if (file.is_open())
    {
        size = file.tellg();
        memblock = new char [size];
        file.seekg (0, ios::beg);
        file.read (memblock, size);
        file.close();

        cout<< memblock<<endl;

        delete[] memblock;
    }
    else
    {
        cout << "no ok"<<endl;
    }
}

Он работает хорошо в первый раз, но когда я запускаю его во второй раз, он добавляет «привет» и некоторые посторонние символы в файл.

Не могли бы вы помочь мне выяснить, в чем дело?

Заранее спасибо

Ответы [ 2 ]

5 голосов
/ 03 июня 2011

Проблема, кажется, не в записи файла, а скорее в чтении и отображении его, а именно здесь:

memblock = new char [size];
file.seekg (0, ios::beg);
file.read (memblock, size);
file.close();
cout<< memblock<<endl;

При отображении с cout ожидается, что строка будет нулевым завершением. Но вы только выделяете достаточно места для содержимого файла, а не терминатора. Добавление следующего должно заставить его работать:

memblock = new char [size+1]; // add one more byte for the terminator
file.seekg (0, ios::beg);
file.read (memblock, size);
file.close();
memblock[size] = 0;  // assign the null terminator
cout<< memblock<<endl;
1 голос
/ 03 июня 2011

Я думаю, что ваши ошибки на выходе:

    memblock = new char [size];
    file.seekg (0, ios::beg);
    file.read (memblock, size);
    file.close();

    cout<< memblock<<endl;

Знает ли cout << memblock << endl запись точно size байтов в выходной поток? Или char foo[] считается строкой в ​​стиле C, _ которая должна заканчиваться ascii NUL?

Если он должен заканчиваться ASCII NUL, попробуйте это:

    memblock = new char [size + 1];
    file.seekg (0, ios::beg);
    file.read (memblock, size);
    file.close();
    memblock[size]='\0';

    cout<< memblock<<endl;
...