Есть ли в C ++ функция, которая создает файл .bin, или в этом коде чего-то не хватает? - PullRequest
0 голосов
/ 26 мая 2009

У меня есть код, который выглядит так:

int main () {
  fstream file;
  file.open("test.bin", ios::out | ios::binary);
  if(!file.is_open())
  {
      return -1;
  }
  int n = 3;
  file.write(reinterpret_cast<char*>(&n), sizeof(n));
  file.close();
  return 0;
}

когда я запускаю его один, он завершается с -1, поэтому очевидно, что он не смог открыть "test.bin". Однако, если я сохраняю пустой файл блокнота как «test.bin» и запускаю его, он работает нормально. Что мне интересно, так это то, как я могу заставить мою программу на C ++ автоматически генерировать пустой файл «test.bin», если файл с именем «test.bin» еще не существует.

Ответы [ 3 ]

2 голосов
/ 26 мая 2009

Полагаю, вы могли бы просто сделать это, открыв и закрыв файл:

if (GetFileAttributes("test.bin") == INVALID_FILE_ATTRIBUTES)
{
    fstream file;
    file.open("test.bin", ios::out);
    file.close();
}
1 голос
/ 26 мая 2009

Ваш фрагмент кода неверен, так как он пытается записать в файл, который вы открыли для ввода. Если вы хотите записать в файл, просто используйте ios::out вместо ios::in.

Если вы хотите открыть файл для чтения, но создать его, если он не существует, вы можете использовать:

file.open("test.bin", ios::in | ios::binary);
if(!file.is_open()) {
    file.open("test.bin", ios::out | ios::binary);
    int n = 3;
    file.write(reinterpret_cast<char*>(&n), sizeof(n));
    file.close();
    file.open("test.bin", ios::in | ios::binary);
    if(!file.is_open()) {
        return -1;
    }
}

Это инициализирует файл с целым числом 3 в качестве содержимого по умолчанию, если он еще не существует.

Если он существует, он оставит содержимое в покое. В любом случае файл будет открыт с первого байта.

1 голос
/ 26 мая 2009

Один из вариантов - открыть для чтения / записи и выполнить поиск в начале файла.

Затем вы можете читать, писать или делать все, что пожелаете.

...