【问题标题】:reading/writing unsigned char array from/to file using filestream使用文件流从/向文件读取/写入无符号字符数组
【发布时间】:2013-11-11 17:04:36
【问题描述】:

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

但是当我使用basic_ifstream<unsigned char>basic_ofstream<unsigned char> 文件流时,这两个函数都无法读取/写入数据,并且无符号字符指针的内容保持不变。下面给出的是代码 sn-ps:

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 并将类型转换为字符指针时,这两个函数都可以正常工作,即

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&lt;unsigned char&gt;basic_ofstream&lt;unsigned char&gt; 对无符号字符指针类型正常工作,或者在使用ifstreamofstream 时避免类型转换?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 但是basic_ifstream&lt;unsigned char&gt;basic_ofstream&lt;unsigned char&gt; 应该可以正常工作,对吧?对于无符号字符类型。是的,那个回报是多余的,我已经纠正了。
    • 好的...但是建议使用演员表吗?它是否读/写没有签名的字符?
    • AFAIK、charsigned charunsigned char 都具有相同的位数。所以我想说 cast 不会改变读取或写入的位模式。
    猜你喜欢
    • 2010-10-10
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2012-12-31
    • 1970-01-01
    相关资源
    最近更新 更多