0

ファイルからデータを読み書きするために連携する 2 つのプログラムがあります。

最初のプログラムは C# フォームです。ユーザーからファイル名を受け取り、それを C ドライブ上のファイルに書き出し、C# アプリケーションを終了/終了します。

関連コード:

private void startBtn_Click(object sender, System.EventArgs e)
{
     using (StreamWriter writer = new StreamWriter("C:\\File.txt"))
     {
         writer.WriteLine(fileName.Text + ".txt");
         writer.Close();
     }
     Application.Exit();
}

C++ での 2 番目のプログラム。このプログラムは、f10 が押されたときにのみ C# アプリケーションを作成し、C# アプリケーションが閉じるまで停止します。次に、C++ プログラムが再開され、C ドライブ上のファイルに書き込まれたファイル名が読み込まれます。C++ プログラムは高度に専門化/カスタマイズされており、追加は慎重に処理する必要があります。

関連コード:

std::string path("C:\\CSharpApp.exe");
system(path.c_str()); //Halts here until CSharpApp exits
if(!reader.is_open()) //Reader is a global ifstream object
{
    reader.open("C:\\File.txt");
}
char temp[MAX_FILE_NAME];//250
reader >> temp;
reader.close();
string temp2 = temp;
//cout << temp2 << endl; //Using to debug
FileName = "C:\\data\\" + temp2;//temp2 contains a file name ending with .txt
if(!writer.is_open())//Writer is a global ofstream object
{
    writer.open(FileName.c_str(),ios::app);
}
//write some stuff to file
writer.close();

初めて f10 キーを押すと、C++ コードが呼び出され、C# アプリが呼び出され、ファイルの名前が正しく保存されます。CSharpApp が終了し、ファイル名が正しく読み取られると、C++ プログラムが再開されます。

問題:

さらに f10 キーを押すと、temp2 の値が何もないことを示す cout ステートメントが表示され、コンソールに endl が表示されます。File.txt には次のファイルの正しい名前が含まれていますが、何らかの理由で C++ プログラムは最初に f10 キーを押したときにのみファイル名を正しく取得します。

この機能の目的は、f10 を押して、f10 を押すたびに新しい名前で新しいファイルを作成することです。

C# アプリを実行すると C++ プログラムが停止するため、両方のプログラムが同時にファイルにアクセスできるとは思えません。また、ファイルを上書きするのではなく、ファイル名を追加するように CSharp アプリケーション内のライターを変更しようとしました。これにより、C++ アプリケーションは temp2 を最初のファイル名のみとして出力し、空白行はありませんでした。これが何を意味するのかわかりません。

現在、この問題の解決に取り組んでおり、進捗があり次第更新します。

アップデート:

の代わりに次を追加しました: reader >> temp;

コード:

if(reader >> temp)
    cout << "Read in ok" << endl;
else
    cout << "PROBLEM OCCURRED" << endl;

現在、私のプログラムは正しく機能していますが、なぜ現在機能しているのかは明確ではありません。私は、これを追加する if test と cout ステートメントは、プログラムにより多くの時間を与えたに違いないと思います。

助けてくれてありがとう

4

1 に答える 1

1

C# アプリでのファイル書き込みが、C++ アプリが読み取ろうとする前にディスクへのコミットを完了していないのではないかと疑っています。writer.Close() を呼び出す前に writer.Flush() を追加してみて、違いがあるかどうかを確認してください。

于 2012-08-14T17:43:07.760 に答える