0

我有两个程序一起工作以从文件中写入和读取数据。

第一个程序是一个 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++ 中的第二个程序。该程序仅在按下 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 按键都会导致 cout 语句显示 temp2 的值为零,我只在控制台中看到 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 回答