2015-10-22 3 views
-1

Перед вызовом функции 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 Кроме того, там, кажется, синхронизация в textread и потому, что если я изменить команду 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 в синхронизации?

+2

Вы не можете написать объект 'std :: string', используя' fwrite', а также не читать его с помощью 'fread'. На самом деле это не какой-либо сложный объект. Он просто не работает. Возможно, вы захотите найти и прочитать о * сериализации *. О, и если вам интересно, почему вы не можете написать такой объект std :: string, это потому, что в основном то, что содержит объект 'std :: string', это длина строки и указатель на фактическую строку , запись указателя на файл не будет работать очень хорошо. –

+0

Также вам не нужно записывать нулевой завершающий символ в файл. Файл уже имеет известный размер. –

+0

Итак, должен ли я попытаться преобразовать строку в массив символов, а затем написать/прочитать ее? – Wormhole

ответ

1

Вам нужно изменить

string read; 

в

char read[7]; 

строка является классом, а не буфер, так что вы можете не Fread давая адрес объекта строки.

Если программа предназначена не только для фиксированной строки в 7 байт, а не только для C (вы отметили вопрос как C++), вам следует рассмотреть возможность использования ifstream/ofstream и строки и записи/чтения с использованием операторов < < и >>.

+0

Хотя я рассматриваю возможность ввода строки, а затем конвертирую ее в 'char [string.length];', и это потому, что: по какой-то причине, когда пробел хранится в 'char []', он не кажется удерживайте его, и когда он будет напечатан с помощью 'cout <<', пробелов нет. Именно по этой причине я использовал строки. – Wormhole

+0

@ Wormhole Конечно, ваша строка может содержать пробелы. Возможно, вы прочитали его с помощью какой-либо другой функции (scanf), которая останавливается в первом пробеле !? –

Смежные вопросы