首页 > 解决方案 > 如何在二进制文件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();
}

它现在正在成功运行。我想按照我的方式格式化文本文件的输出。

我有:

嗨,这是我编写的第一个程序,这是一个实验

如何使我的输出文件如下所示:

嗨,这是第一个程序

我写这是一个实验

我应该怎么做才能以这种方式格式化输出?

标签: c++

解决方案


首先,

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');

这样它就可以在您的平台上运行(并且不会在其他平台上运行)。

这就是为什么如果你想写文本,你应该在文本模式下写。


推荐阅读