我有两个程序一起编写和读取文件中的数据。
第一个程序是C#表单。它从用户接收文件名并将其写入C驱动器上的文件并退出/关闭C#应用程序。
Revelvant代码:
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#app并正确存储文件名。当CSharpApp关闭并正确读取文件名时,C ++程序将恢复。
问题:
任何额外的f10键按下都会导致cout语句显示temp2的值为nothing,我只是在控制台中看到endl。 File.txt包含下一个文件的正确名称,但由于某种原因,C ++程序仅在第一次按下f10时才正确获取文件名。
此功能的目的是按下f10并在每按一次f10时使用新名称创建一个新文件。
我认为两个程序不能同时访问该文件,因为C#app的执行会暂停C ++程序。此外,我尝试更改CSharp应用程序内的编写器以附加文件名,而不是覆盖该文件。这导致C ++应用程序将temp2打印为仅作为第一个文件名,并且没有空行。不确定这意味着什么。
我目前正在努力解决这个问题,并会在我取得进展时进行更新。
更新:
我添加了以下代码:reader&gt;&gt;温度;
代码:
if(reader >> temp)
cout << "Read in ok" << endl;
else
cout << "PROBLEM OCCURRED" << endl;
现在我的程序运行正常,但我不清楚为什么它现在正在运行。对我来说,我假设添加这个,如果test和cout语句必须给程序更多的时间。
感谢您的帮助
答案 0 :(得分:1)
我怀疑在C ++应用程序尝试读取之前,C#应用程序中的文件写入未完成提交到磁盘。您可以尝试在调用writer.Close()之前添加writer.Flush(),看看它是否有任何区别。