Перед вызовом функции fread()
у меня возникла проблема с кодированием в C++. Цель состоит в том, чтобы открыть файл в двоичном режиме для записи с использованием: fopen_s(&filename,filelocation,"wb");
, написать строку и int, чтобы быть точным, используя fwrite(&buffer,size_of_read,count,filename)
, а затем прочитать данные в другие переменные (обратите внимание, что это может показаться глупо писать, а затем читать данные из того же файла в той же программе, но это только для целей тестирования, так как проект, над которым я работаю, строго основан на шифровании, и это один из модулей) ...fread() двоичный режим не работает должным образом в C++
Вот мой код :
int x = 1; // this is piece of data to write to the file
FILE *src; // the file variable that I am using
string text = "byebye"; // this happens to be the piece of data
src = fopen("F:\\_log.log", "wb"); // open file in binary write mode
fwrite(&text, 1, 7, src); // that's 7 because of 6 characters plus '\0'
fwrite(&x, 4, 1, src); // 4 bytes for int ---> writing x=1 to file
text.clear(); // for verification purpose
fclose(src);
src = fopen("F:\\_log.log", "rb");
int y = 0; // this is the int that will contain read data
string read; // string that contains read data
fread(&read, 1, 7, src); // read the data and store in read
fread(&y, 4, 1, src); // read the stored int into y
cout << "string is : " << read << "\nNumber is : " << y << endl;
выход выше программы кажется правильным для целых, но не для строк ...
string is :
Number is : 1
The Number is : 1
заявления очищает, что первый y
был равен нулю, но данные из файла были успешно считаны и сохранены в y
, который затем обратился к 1
Но, если число было правильно прочитать, то почему не строка read
Кроме того, там, кажется, синхронизация в text
read
и потому, что если я изменить команду text.clear();
к text="higuys";
то выход:
string is : higuys
Number is : 1
Как это решить? (Совершенно не в состоянии понять, что в мире обрабатывается в этом коде ...)
Дополнительная информация (хотя это не может сделать много хорошего):
ОС: Windows 10
IDE: CodeBlocks (пробовал с визуальной студии тоже)
Компилятор: GNU GCC
Debugger: GDB
Я попытался проверить любые ошибки с использованием perror();
и трюки типа cout<<fread(&read,1,7,src)<<endl;
для проверки количества прочитанных байтов, но все было в порядке. Пожалуйста, помогите мне с этим .....
EDIT:
ОК, я попытался использовать массив char
вместо string
и она работала !! Но все-таки одно не ясно, и это так: почему две строки text
и read
в синхронизации?
Вы не можете написать объект 'std :: string', используя' fwrite', а также не читать его с помощью 'fread'. На самом деле это не какой-либо сложный объект. Он просто не работает. Возможно, вы захотите найти и прочитать о * сериализации *. О, и если вам интересно, почему вы не можете написать такой объект std :: string, это потому, что в основном то, что содержит объект 'std :: string', это длина строки и указатель на фактическую строку , запись указателя на файл не будет работать очень хорошо. –
Также вам не нужно записывать нулевой завершающий символ в файл. Файл уже имеет известный размер. –
Итак, должен ли я попытаться преобразовать строку в массив символов, а затем написать/прочитать ее? – Wormhole