Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.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++_File Io_Binaryfiles - Fatal编程技术网

C++ 用C+读取和写入二进制信息+;

C++ 用C+读取和写入二进制信息+;,c++,file-io,binaryfiles,C++,File Io,Binaryfiles,我读写二进制信息有点困难。我可以成功地将一个简单的字符串写入文本文件,在这种情况下,我的文件“output.dat”包含一句话“Hello,这是一个句子” 但是,我无法读回我的信息。我无法确定问题所在。我打算稍后更改从二进制文件读取的信息的每个字节,因此以字符串形式返回值会有所帮助 谢谢你能提供的帮助 #include <iostream> #include <fstream> #include <string> using namespace std; v

我读写二进制信息有点困难。我可以成功地将一个简单的字符串写入文本文件,在这种情况下,我的文件“output.dat”包含一句话“Hello,这是一个句子”

但是,我无法读回我的信息。我无法确定问题所在。我打算稍后更改从二进制文件读取的信息的每个字节,因此以字符串形式返回值会有所帮助

谢谢你能提供的帮助

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

void write(const string &input) {
    fstream output("output.dat", ios::out | ios::binary);
    if (output.is_open()) {
        output.write(input.c_str(), input.size());
        output.close();
    }
}

string read(const string &fname) {
    int size;
    char* buffer;
    fstream input(fname, ios::in | ios::binary);
    if (input.is_open()) {
        input.seekg(0, ios::end);
        size = input.tellg();
        input.seekg(0, ios::beg);
        buffer = new char[size];
        input.read(buffer, size);
        input.close();
    }
    string result(buffer);
    return result;
}

int main () {
    cout << read("output.dat") << endl;

    system("pause");

    return 0;
}
#包括
#包括
#包括
使用名称空间std;
无效写入(常量字符串和输入){
fstream输出(“output.dat”,ios::out | ios::binary);
if(output.is_open()){
output.write(input.c_str(),input.size());
output.close();
}
}
字符串读取(常量字符串和fname){
整数大小;
字符*缓冲区;
fstream输入(fname,ios::in | ios::binary);
if(input.is_open()){
input.seekg(0,ios::end);
size=input.tellg();
输入。seekg(0,ios::beg);
缓冲区=新字符[大小];
输入读取(缓冲区、大小);
input.close();
}
字符串结果(缓冲区);
返回结果;
}
int main(){
虫子就在这里

char* buffer;
input.read(buffer, size);
您正在读取
buffer
指向的内存

但是它指向哪里?指针
缓冲区
从未初始化过


如果你知道你需要多少空间,像这样的方法会奏效

std::vector<char> buffer(size);
input.read(&buffer.front(), size);
std::向量缓冲区(大小);
input.read(&buffer.front(),size);
错误就在这里

char* buffer;
input.read(buffer, size);
您正在读取
buffer
指向的内存

但是它指向哪里?指针
缓冲区
从未初始化过


如果你知道你需要多少空间,像这样的方法会奏效

std::vector<char> buffer(size);
input.read(&buffer.front(), size);
std::向量缓冲区(大小);
input.read(&buffer.front(),size);

我真的无法理解这段代码出了什么问题,因为它看起来很好,我也能正常工作。但是,您正在分配的缓冲区缺少空终止符来标记char string end。只需将其更改为:

buffer = new char[size+1];
input.read(buffer, size);
buffer[size] = 0;

我真的无法理解这段代码出了什么问题,因为它看起来很好,我也能正常工作。不过,您正在分配的缓冲区缺少用于标记char string end的null终止符。只需将其更改为:

buffer = new char[size+1];
input.read(buffer, size);
buffer[size] = 0;


“如果你知道你需要多少空间”,所需要的空间是
size
可能在某些编译器中工作?如果我不确定需要多少空间该怎么办。顺便说一句。固定缓冲区实际上从来都不是正确的答案。只需使用
std::vector
。哦,我的错误,我只是忘了写这个。我用大小来指定缓冲区的大小。“如果你知道你需要多少空间”,所需的空间是
size
。我认为
char buffer[size]
可能在某些编译器中工作?如果我不确定需要多少空间该怎么办。顺便说一句。固定缓冲区实际上从来都不是正确的答案。只需使用
std::vector
。哦,我的错误,我只是忘了写这个。我用大小来指定缓冲区的大小。上面的代码有什么问题吗?它对我来说很好。Y你没有向文件中写入任何期望值。我认为整个问题是在我重写读取函数时。我忘记初始化缓冲区的大小。我现在唯一的问题是如何在写入信息之前向每个字节添加5?你更新的代码正在泄漏内存。考虑到这是一个类练习,这没什么大不了的。Wh上面的代码有什么问题吗?它对我来说很好。你没有向文件中写入任何期望值。我认为整个问题是在我重写读取函数时。我忘记初始化缓冲区的大小。我现在唯一的问题是如何在写入信息之前向每个字节添加5?你更新的代码正在泄漏内存y、 考虑到这是一个课堂练习,这没什么大不了的。是的,我只是忘了添加一行并指定缓冲区的大小。我觉得自己像个白痴,但至少现在可以工作了。是的,我只是忘了添加一行并指定缓冲区的大小。我觉得自己像个白痴,但至少现在可以工作了。