我在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”和一些外部字符。
你能帮我弄清楚出了什么问题吗?
提前致谢
答案 0 :(得分:5)
问题似乎不是写文件,而是阅读和显示,即:
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 :(得分: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;