我有两个程序一起工作来写入和读取文件中的数据。文件读取问题C++/C#
第一个程序是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#应用程序和文件的名称正确保存。 C++程序在CSharpApp关闭并且文件名被正确读取时恢复。
问题:
任何额外的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;
现在我的程序运行正常,但我不明白,为什么它现在的工作。对我来说,我假设如果测试和cout语句添加了这个,肯定会给程序更多的时间。
感谢您的帮助
你的意思是_reader是一个全球性的ifstream object_?建议检查'reader.good()'和'if(reader >> temp)'以确保读取成功。 – hmjd 2012-08-14 17:02:56
P.S.对于全局变量,文字字符串(例如:'path(“C:\\ CSharpApp.exe”);')和魔术数字(例如'char temp [250];'中的250) 。最好将这些文字字符串和幻数改成常量。 – MartyE 2012-08-14 17:42:50
@hmjd我加了if语句,它的工作原理,谢谢你的建议。正如我上面所说,我很困惑这是如何解决问题的。 – Brandon 2012-08-14 18:26:37