c++ - 使用文件流从文件读取/写入无符号字符数组

标签 c++ file-io filestream unsigned-char

它可能看起来很简单,但我要找出它不起作用的原因。我有两个功能 read_file_cpp() & write_file_cpp() . read_file_cpp()读取文件并将其存储在 unsigned char 指针 & write_file_cpp() 中将数据从 unsigned char 指针写回文件。

但是当我使用 basic_ifstream<unsigned char>basic_ofstream<unsigned char>文件流,这两个函数都无法读取/写入数据,并且 unsigned char 指针的内容保持不变。以下是代码片段:

int read_file_cpp(unsigned char *pInData,
                  int in_len,
                  string file_name) {

    basic_ifstream<unsigned char> file_stream;

    file_stream.open(file_name.c_str(),ios::in | ios::binary);

    if (!file_stream.is_open()) {
        cout << stderr << "Can't open input file !\n";
        exit(1);
    }
    else{
        file_stream.read(pInData,in_len);
    }

    file_stream.close();

    return 0;
}

int write_file_cpp(string file_name,
                   unsigned char *pOutData,
                   int out_len) {

basic_ofstream<unsigned char> file_stream;

file_stream.open(file_name.c_str(),ios::out | ios::binary | ios::trunc);

if (!file_stream.is_open()) {
    cout << stderr << "Can't open output file !\n";
    exit(1);
}
else{
    file_stream.write(pOutData,out_len);
}

file_stream.close();

return 0;
}

但是当我使用 ifstreamofstream并将类型转换为 char 指针,这两个函数都可以正常工作,即

int read_file_cpp(unsigned char *pInData,
                  int in_len,
                  string file_name) {

    ifstream file_stream;

    file_stream.open(file_name.c_str(),ios::in | ios::binary);

    if (!file_stream.is_open()) {
        cout << stderr << "Can't open input file !\n";
        exit(1);
    }
    else{
        file_stream.read((char *)pInData,in_len);
    }

    file_stream.close();

    return 0;
}

工作正常。有没有办法制作basic_ifstream<unsigned char>basic_ofstream<unsigned char>ifstream 时可以正确处理 unsigned char 指针类型或避免类型转换或 ofstream是用的吗?

最佳答案

类型转换是必需的,因为 unsigned char 没有 istream 或 ostream 方法。

顺便说一下,在你的函数中你可能想要返回实际写入或读取的字节(否则它是多余的,因为它是传入的。)

使用std::istream::gcount读取字符。

关于c++ - 使用文件流从文件读取/写入无符号字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19911885/

相关文章:

c++ - gpsd 客户端数据缓冲区

c - 在 Linux 内核模块中读/写文件

C:在文件中搜索内容

c# - 默认缓冲区大小为 4096 有什么原因吗?

c# - 检索 Sql FileStream 文件

c++ - 如何在 C++ 中打印已定义常量的内存地址

c++ - Qt:调整包含 QPixmap 的 QLabel 的大小,同时保持其纵横比

c# - 使用自定义 Read() 和 Write() 功能装饰 FileStream

c++ - 列表将类转换为父类

ruby - 如何使用 RSpec 测试文件创建?