c++ - 如何在二进制文件c ++中创建一个新行?
问题描述
任何人都可以在文件处理中帮助我解决这个简单的事情吗?
这是我的代码:
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main()
{
fstream f;
f.open("input05.bin", ios_base::binary | ios_base::out);
string str = "";
cout << "Input text:"<<endl;
while (1)
{
getline(cin, str);
if (str == "end")
break;
else {
f.write((char*)&str, sizeof(str));
}
}
f.close();
f.open("input05.bin", ios_base::in | ios_base::binary);
while (!f.eof())
{
string st;
f.read((char*)&st, sizeof(st));
cout << st << endl;
}
f.close();
}
它现在正在成功运行。我想按照我的方式格式化文本文件的输出。
我有:
嗨,这是我编写的第一个程序,这是一个实验
如何使我的输出文件如下所示:
嗨,这是第一个程序
我写这是一个实验
我应该怎么做才能以这种方式格式化输出?
解决方案
首先,
string str;
....
f.write((char*)&str, sizeof(str));
绝对错误,因为您将指向类型对象的std::string
指针转换为指向字符的指针,即char*
. 请注意,anstd::string
是一个具有数据成员(如字符串长度)和指向保存字符串内容的内存的指针的对象,但它不是类型为 的 c 字符串char *
。此外,sizeof(str)
使用长度成员和指针为您提供“包装器对象”的大小,但它不给您字符串的长度。
所以它应该是这样的:
f.write(str.c_str(), str.length());
另一件事是换行符的操作系统相关处理。根据操作系统,新行由0x0d 0x0a
或仅由表示0x0d
。在内存中,c++ 总是将换行视为单个字符'\n'
(即0x0d
)。在文本模式下写入文件时,c++ 将扩展'\n'
为0x0d 0x0a
或仅将其保留为0x0d
(取决于平台)。但是,如果您以二进制模式写入文件,则不会发生这种替换。因此,如果您以二进制模式创建文件并仅插入 a 0x0d
,那么 - 根据平台 - 在控制台中打印文件不会导致新行。
试着写...
f.write(str.c_str(), str.length());
f.put('\r');
这样它就可以在您的平台上运行(并且不会在其他平台上运行)。
这就是为什么如果你想写文本,你应该在文本模式下写。