Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在二进制文件c++;?_C++ - Fatal编程技术网

C++ 如何在二进制文件c++;?

C++ 如何在二进制文件c++;?,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 = "";

有人能帮我处理这个简单的文件吗

这是我的代码:

#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();
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
fsf;
f、 打开(“input05.bin”,ios_base::binary | ios_base::out);
字符串str=“”;
不能首先

string str;
....
f.write((char*)&str, sizeof(str));
当您将指向类型为
std::string
的对象的指针强制转换为指向字符的指针(即
char*
)时,这是绝对错误的。请注意,
std::string
是一个对象,具有字符串长度等数据成员和指向保存字符串内容的内存的指针,但它不是类型为
c的c字符串har*
。此外,
sizeof(str)
提供“包装器对象”的大小以及长度成员和指针,但不提供字符串的长度

所以应该是这样的:

f.write(str.c_str(), str.length());
另一个问题是操作系统依赖于新的行字符。根据操作系统,一个新的行由“代码> 0x0D 0x0a < /CODE >或仅由<代码> 0x0d<代码>表示。在内存中,C++将新的一行始终作为单个字符<代码> \n′/COD>(即<代码> 0x0d<代码>)。当以文本模式写入文件时,C++将将<代码> \n '/COD>扩展为<代码> 0x0d 0x0a < /COD>或保持它为<代码> 0x0d< /Cord>(取决于平台)。但是,如果您以二进制模式写入文件,则不会发生此替换。因此,如果您以二进制模式创建文件并仅插入一个
0x0d
,则根据平台的不同,在控制台中打印文件不会产生新的行

试着写

f.write(str.c_str(), str.length());
f.put('\r');
这样它就可以在您的平台上工作(而不会在其他平台上工作)


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

你应该写由换行符组成的东西。
你熟悉什么是
“\n”
?@Fureeish谢谢。你的意思是我应该写f.write((char*)和“\n”,sizeof(“\n”))?那就行了。但是,问题是,二进制文件中的新行应该是什么?行在人类可以读取的东西中当然有完美的意义,比如典型的ASCII文件。但是,如果在文本编辑器中打开一个二进制文件,它会像一堆随机的特殊字符一样出现。而且,您可能有一些新行,而不是您想要的行只是因为某个变量的一个字节恰好携带了新行在ASCII中的值,所以可以在文档中任意插入。除非您喜欢键入不必要的字符,
f.put('\n');
似乎更容易。
f.write((char*)&str,sizeof(str));…f.read((char*)&st,sizeof(st))在
std::string
上执行文件I/O绝对是错误的,
f.write((char*)和“\n”,sizeof(“\n”)
是错误的,
(char*)和“\n”
可以是
“\n”
,但是
sizeof(“\n”)
不会返回您认为它会返回的内容。而且,非常感谢大家