чтение / запись массива без знака из / в файл с использованием файлового потока

Это может выглядеть просто, но я должен найти причину, почему это не работает. У меня две функции read_file_cpp() & write_file_cpp(), read_file_cpp() читает файл и сохраняет его в беззнаковом указателе & write_file_cpp() записывать данные из беззнакового указателя на символ в файл.

Но когда я использую basic_ifstream<unsigned char> или же basic_ofstream<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;
}

Но когда я использую ifstream или же ofstream и typecast to char pointer, обе функции работают должным образом, т.е.

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 или же ofstream используется?

3

Решение

Typecast требуется, потому что для unsigned char нет методов istream или ostream.

Кстати, в ваших функциях вы можете захотеть вернуть реальные записанные или прочитанные байты (в противном случае это избыточно, поскольку оно передается.)

использование станд :: IStream :: gcount чтобы прочитать символы.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]