2011-06-03 81 views
2

我想一个基本的输入,输出(及附加)在C++中,这里是我的代码二进制文件的输入,输出和追加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; 
    } 
} 

它运行良好的第一次,但是当我运行它第二次将“hello”和一些extrange字符添加到文件中。

你能帮我弄清楚有什么问题吗?

在此先感谢

+0

我不能重现此:我得到完全 “hellohello”'68 1207 6C 6C 6F 68 6C 6F 6C 6f'与VC10 。你能发布文件的十六进制内容吗? – 2011-06-03 02:39:05

+0

Argh。没有看到滚动条。 – 2011-06-03 03:04:56

回答

5

似乎问题并不与文件,而是阅读和显示它,即在这里:

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

与COUT显示预期字符串以null结尾。但是,您只为文件内容分配了足够的空间,而不是终结器。添加以下应使其工作:

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

我认为你的错误输出:

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;