Это может выглядеть просто, но я должен найти причину, почему это не работает. У меня две функции 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
используется?
Typecast требуется, потому что для unsigned char нет методов istream или ostream.
Кстати, в ваших функциях вы можете захотеть вернуть реальные записанные или прочитанные байты (в противном случае это избыточно, поскольку оно передается.)
использование станд :: IStream :: gcount чтобы прочитать символы.
Других решений пока нет …