6

私は最も基本的なことをしようとしています.... C ++でファイルを書きますが、ファイルは書き込まれません。エラーも発生しません。多分私は明らかな何かを見逃しています...または何ですか?

コードに問題があると思いましたが、ネットで見つけたサンプルも試してみましたが、まだファイルが作成されません。

これはコードです:

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

事前に手動でファイルを作成してみましたが、まったく更新されません。

これと関係がある場合は、Windows 7 64ビットを実行しています。ファイル書き込み操作が完全に禁止されており、エラー メッセージや例外が表示されないようです。

4

6 に答える 6

3

ファイルを書き込みモードで開く必要があります。

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

その 2 番目の引数の他のオプションも確認してください。たとえば、バイナリデータを書き込んでいる場合は、必要ios::binaryになります。

また、ストリームを開いた後にストリームを確認する必要があります。

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

アップデート:

ofstreamAraK は正しいです。an がデフォルトで書き込みモードであることを忘れていたので、それは問題ではありません。

おそらく、ディレクトリへの書き込み/作成権限がありませんか? Win7 では、多くのディレクトリがデフォルトで「すべて拒否」という特別な権限を持っています。または、そのファイルが既に存在し、読み取り専用になっている可能性がありますか?

于 2009-10-12T22:24:16.250 に答える
2

そのスラッシュを回すことから始めます。
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();
}
  • ディレクトリが存在することを確認してください。
  • ファイルが存在する場合は、(あなたが) 書き込み可能であることを確認してください
  • あなたが書き込んでいるディレクトリが書き込み可能であることを確認してください(あなたによって)
于 2009-10-12T23:11:33.940 に答える
1

このコードは、すべてのエラーをキャッチする必要があります。エラーが発生した場合は、ほとんどの場合、アクセス許可の問題です。ファイルを作成しているフォルダに読み書きできることを確認してください。

#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 Enterprise でコードをテストしたところ、最初は失敗しました (失敗ビットが設定されていました)。次に、ユーザー アカウント制御 (UAC) をオフにして再度テストしたところ、ファイルが書き込まれました。それはおそらくあなたが見ているのと同じ問題です。UAC をオフにするには、次の場所に移動します。

コントロール パネル (小さなアイコンで表示) | ユーザー アカウント | ユーザー アカウント制御の設定を変更します。[通知しない] に設定し、[OK] ボタンをクリックします。変更を有効にするには、再起動する必要があります。

UAC をオンにして動作させる方法に興味があります。調べてみます。

于 2009-10-18T02:43:55.960 に答える
1

Windows Vista および 7 での UAC (ユーザー アカウント制御) および UAC 仮想化/データ リダイレクトについて読んだことがありますか? ファイルが実際に仮想ストアにある可能性があります。

ユーザー アカウント制御データのリダイレクト

サンプルの出力ディレクトリはユーザーにあるため、これが問題になるとは思いませんが、言及する価値のある可能性であり、注意を払わないと非常にイライラする可能性があります!

お役に立てれば。

于 2009-10-12T22:52:51.870 に答える
0

これを試して:

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

//find the error code and look up what it means.
}
于 2009-10-12T23:06:43.853 に答える
0

FileMon を使用して、プロセスからの失敗した WriteFile 呼び出しを探します。

于 2009-11-20T03:11:37.873 に答える