2016-01-12 2 views
0

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

int bufferScore; //temporary storage for score from file. 
int gamePoints; 
cout << "number: "; cin >> gamePoints; 

fstream score_file("Score_file.bin", ios::binary | ios::in | ios::out); 
if (score_file.is_open()) 
{ 
    score_file.seekg(0); 
    score_file.read(reinterpret_cast<char *>(&bufferScore), sizeof(bufferScore)); 
    if (gamePoints > bufferScore) 
    { 
     cout << "NEW HIGH SCORE: " << gamePoints << endl; 
     score_file.seekp(0); 
     score_file.write(reinterpret_cast<char *>(&gamePoints), sizeof(gamePoints)); 
    } 
    else 
    { 
     cout << "GAME SCORE: " << gamePoints << endl; 
     cout << "HIGH SCORE: " << bufferScore << endl; 
    } 
} 
else 
{ 
    cout << "NEW HIGH SCORE: " << gamePoints << endl; 
    score_file.seekp(0); 
    score_file.write(reinterpret_cast<char *>(&gamePoints), sizeof(gamePoints)); 
} 
score_file.close(); 
+0

Я вижу, что вы ищете, писать и закрыть файл. Но я не вижу, чтобы вы явно открывали файл ... Я не думаю, что 'is_open' фактически открывает файл. Я вижу из [онлайн-ссылки] (http://www.cplusplus.com/reference/fstream/fstream/fstream/) конструктор должен открыть файл, но, по-видимому, в вашем случае он не открывает его, да? Можете ли вы также предоставить вывод, напечатанный при запуске программы? – tniles09

+0

Спасибо @Pete Becker. Просто поймал, что сам :) – tniles09

+0

в дополнение к любому печатному выходу вы также можете вставить весь код? Например, я не вижу ваш '#include ' (см. Пример из онлайн-справки). – tniles09

ответ

0

Если файл не существует, то вы должны попробовать еще раз, чтобы открыть его без std::ios::in

Во-вторых, вы можете просто использовать стандартный C++ И.О. вместо записи двоичных данных. Это немного медленнее, но гораздо более совместимо на разных платформах. Вы все еще можете использовать ios::binary флаг, если вы не хотите, чтобы программа для изменения новых линий и т.д.

std::string filename = "Score_file.bin"; 

std::fstream file(filename, std::ios::in | std::ios::out | std::ios::binary); 
if (!file) 
{ 
    cout << "create new file\n"; 
    file.open(filename, std::ios::out | std::ios::binary); 
    if (!file) 
    { 
     cout << "permission denied...\n"; 
     return 0; 
    } 
} 

cout << "read existing file...\n"; 
int i = 0; 
while(file >> i) 
    cout << "reading number: " << i << "\n"; 

//write new number at the end 
file.clear(); 
file.seekp(0, std::ios::end); 
file << 123 << "\n";