Не мог записать файл в C++

Короткий ответ: Вы не можете.

Более длинный ответ: Пользуйтесь библиотекой проклятий (ncurses на Unix, pdcurses в Windows). NCurses должен быть доступным через Ваш диспетчер пакетов, и и ncurses и pdcurses имеют тот же самый интерфейс (pdcurses, может также создать окна независимо из консоли, которые ведут себя как консоли).

самый трудный ответ: Используйте #ifdef _WIN32 и материал как этот, чтобы заставить Ваш код действовать по-другому на различные операционные системы.

5
задан Joshua 20 November 2009 в 03:03
поделиться

6 ответов

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

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

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

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

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

Обновление:

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

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

3
ответ дан 14 December 2019 в 08:55
поделиться

Начните с поворота косой черты.
Даже 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();
}
  • Убедитесь, что каталог существует.
  • Если файл существует, убедитесь, что он доступен для записи (вами)
  • Убедитесь, что каталог, в который вы пишете, доступен для записи (вами)
2
ответ дан 14 December 2019 в 08:55
поделиться

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

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

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

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

1
ответ дан 14 December 2019 в 08:55
поделиться

Попробуйте следующее:

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

//find the error code and look up what it means.
}
0
ответ дан 14 December 2019 в 08:55
поделиться

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

#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
ответ дан 14 December 2019 в 08:55
поделиться

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

0
ответ дан 14 December 2019 в 08:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: