2013-09-20 2 views
1

Мне очень тяжело писать в двоичный файл и читать. Я в основном пишу запись этого форматаifstream/ofstream проблема с C++?

1234|ABCD|efgh|IJKL|ABC 

Прежде чем писать эту запись, я написал бы длину всей этой записи (using string.size()), а затем я пишу запись в двоичный файл, используя ofstream следующим образом:

ИНТ размер;

ofstream studentfile; 
studentfile.open(filename.c_str(),ios::out|ios::binary); 
studentfile.write((char*)&size,sizeof(int)); 
    studentfile.write(data.c_str(),(data.size()*(sizeof(char)))); 
    cout << "Added " << data << " to " << filename << endl; 
    studentfile.close(); 

И я прочитал эту информацию на каком-то другом месте

ifstream ifile11; 
    int x; 
    std::string y; 
    ifile11.open("student.db", ios::in |ios::binary); 
    ifile11.read((char*)&x,sizeof(int)); 
    ifile11.read((char*)&y,x); 
    cout << "X " << x << " Y " << y << endl; 

Сначала я прочитал длину записи в переменной x, а затем прочитал запись в строке y. Проблема заключается в том, что на выходе отображается x как «0», а «y» пуст.

Я не умею это понять. Тот, кто может изучить эту проблему и дать некоторое представление, будет очень благодарен.

Спасибо

ответ

2

Вы не можете прочитать строку, таким образом, как std::string действительно только указатель и член размер. (Попробуйте делать std::string s; sizeof(s), размер будет постоянным, независимо от того, что вы установите строку.)

Вместо того, чтобы читать его во временный буфер, а затем преобразовать этот буфер в строку:

int length; 
ifile11.read(reinterpret_cast<char*>(&length), sizeof(length)); 

char* temp_buffer = new char[length]; 
ifile11.read(temp_buffer, length); 

std::string str(temp_buffer, length); 
delete [] temp_buffer; 
+0

Не могли бы вы рассказать подробнее? Спасибо –

+0

@SasankaPanguluri Обновленный ответ. –

+0

Не повезло :(Все еще дает «0» и пустую строку .. –

0

Я знаю, Я отвечаю на свой вопрос, но я строго считаю, что эта информация поможет всем. В большинстве случаев ответ Йоакима правильный и работает. Тем не менее, есть две основные проблемы, стоящие за моей проблемой:

1. The Dev-C++ compiler was having a hard time reading binary files. 

2. Not passing strings properly while writing to the binary file, and also reading from the file. For the reading part, Joachim's answer fixed it all. 

Dev-C++ IDE мне не помог. Он неправильно считывал данные из двоичного файла, и он сделал это без меня, даже используя temp_buffer. Visual C++ 2010 Express правильно определил эту ошибку и бросил исключения во время выполнения и не дал мне ввести в заблуждение. Как только я взял весь свой код в новый проект VC++, он соответствующим образом предоставил мне сообщения об ошибках, чтобы я мог исправить все это.

Итак, пожалуйста, не используйте Dev-C++, если вы не хотите столкнуться с настоящими проблемами, такими как thiis. Кроме того, при попытке прочитать строки, ответ Йоахима был бы идеальным способом.

+0

Пожалуйста, не слепо приравнивайте Dev-C++ к старой и багги. https://sourceforge.net/projects/orwelldevcpp/ – Orwell

+0

Извините, если это означало диффамацию.В какой-то момент я был уверен. Я не мог много помочь. Компилятор, который у меня был на Dev-C++, не мог, по крайней мере, прочитать двоичный файл. Я не знаю никакой точной причины. –