Невозможно записать файл в C ++ - PullRequest
5 голосов
/ 13 октября 2009

Я пытаюсь понять самые простые вещи ... написать файл на C ++, но файл не пишется. Я тоже не получаю никаких ошибок. Может быть, я упускаю что-то очевидное ... или что?

Я подумал, что с моим кодом что-то не так, но я также попробовал пример, который нашел в сети, но файл так и не был создан.

Это код:

ofstream myfile;
myfile.open ("C:\\Users\\Thorgeir\\Documents\\test.txt");
myfile << "Writing this to a file.\n";
myfile.close();

Я также пытался заранее создать файл вручную, но он вообще не обновляется.

Я использую Windows 7 64bit, если это как-то связано с этим. Это похоже на то, что операции записи в файл полностью запрещены, и сообщения об ошибках или исключения не отображаются.

Ответы [ 6 ]

3 голосов
/ 13 октября 2009

Вам нужно открыть файл в режиме записи:

myfile.open ("C:\\Users\\Thorgeir\\Documents\\test.txt", ios::out);

Обязательно посмотрите и другие опции для этого второго аргумента. Если вы пишете двоичные данные, вам нужно, например, ios::binary.

Вы также должны проверять поток после его открытия:

myfile.open(...
if (myfile.is_open())
    ...

Обновление:

AraK прав, я забыл, что ofstream по умолчанию находится в режиме записи, так что это не проблема.

Возможно, у вас просто нет прав на запись / создание каталога? По умолчанию в Win7 много каталогов со специальными разрешениями «запретить все». Или, возможно, этот файл уже существует и доступен только для чтения?

2 голосов
/ 13 октября 2009

Начните с поворота этого слеша.
Даже Windows понимает, что косая черта - наоборот.

ofstream myfile("C:/Users/Thorgeir/Documents/test.txt");

Вы можете проверить наличие ошибок:

if (!myfile)
{
    std::cout << "Somthing failed while opening the file\n";
}
else
{
    myfile << "Writing this to a file.\n";
    myfile.close();
}
  • Убедитесь, что каталог существует.
  • Если файл существует, убедитесь, что он доступен для записи (вами)
  • Проверьте, доступен ли для записи каталог, в который вы пишете
1 голос
/ 18 октября 2009

Этот код должен отлавливать любую ошибку. Скорее всего, это проблема с разрешениями, если возникнут какие-либо ошибки. Убедитесь, что вы можете читать / писать в папку, в которой вы создаете файл.

#include "stdafx.h"
#include <fstream>
#include <iostream>

bool CheckStreamErrorBits(const std::ofstream& ofile);

int _tmain(int argc, _TCHAR* argv[]) {
 std::ofstream ofile("c:\\test.txt");
 if(ofile.is_open()) {
  CheckStreamErrorBits(ofile);  
  ofile << "this is a test" << std::endl;
  if(CheckStreamErrorBits(ofile)) {
   std::cout << "successfully wrote file" << std::endl;
  }
 }else {
  CheckStreamErrorBits(ofile);
  std::cerr << "failed to open file" << std::endl;
 }

 ofile.close();
 return 0;
}

//return true if stream is ok.  return false if stream has error.
bool CheckStreamErrorBits(const std::ofstream& ofile) {
 bool bError=false;
 if(ofile.bad()) {
  std::cerr << "error in file stream, the bad bit is set" << std::endl;
  bError=true;
 }else if(ofile.fail()) {
  std::cerr << "error in file stream, the fail bit is set" << std::endl;
  bError=true;
 }else if(ofile.eof()) {
  std::cerr << "error in file stream, the eof bit is set" << std::endl;
  bError=true;
 }
 return !bError;
}

Обновление: Я только что протестировал свой код в Windows 7 Enterprize, и он не прошел первый раз (был установлен бит сбоя). Затем я отключаю Контроль учетных записей (UAC) и снова тестирую, и он пишет файл. Это, вероятно, та же самая проблема, которую вы видите. Чтобы отключить UAC, перейдите по ссылке:

Панель управления (просмотр по маленьким значкам) | Аккаунты пользователей | Изменить настройки контроля учетных записей. Установите значение Никогда не уведомлять, затем нажмите кнопку ОК. Вам нужно будет перезапустить, чтобы изменения вступили в силу.

Мне любопытно, как заставить его работать с UAC, я посмотрю на это.

1 голос
/ 13 октября 2009

Читали ли вы о UAC (контроль учетных записей) и виртуализации UAC / перенаправлении данных в Windows Vista и 7? Возможно, ваш файл действительно находится в виртуальном магазине.

Перенаправление данных контроля учетной записи пользователя

Ваш пример выходного каталога находится в Users, поэтому я не думаю, что это будет проблемой, но стоит упомянуть об этом, и это может очень расстроить, если вы не обращаете на это внимания!

Надеюсь, это поможет.

0 голосов
/ 20 ноября 2009

Используйте FileMon и ищите неудачные вызовы WriteFile из вашего процесса.

0 голосов
/ 13 октября 2009

Попробуйте это:

if( ! myfile)
{
cerr << "You have failed to open the file\n";

//find the error code and look up what it means.
}
...