2012-08-14 102 views
0

我有两个程序一起工作来写入和读取文件中的数据。文件读取问题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语句添加了这个,肯定会给程序更多的时间。

感谢您的帮助

+1

你的意思是_reader是一个全球性的ifstream object_?建议检查'reader.good()'和'if(reader >> temp)'以确保读取成功。 – hmjd 2012-08-14 17:02:56

+1

P.S.对于全局变量,文字字符串(例如:'path(“C:\\ CSharpApp.exe”);')和魔术数字(例如'char temp [250];'中的250) 。最好将这些文字字符串和幻数改成常量。 – MartyE 2012-08-14 17:42:50

+0

@hmjd我加了if语句,它的工作原理,谢谢你的建议。正如我上面所说,我很困惑这是如何解决问题的。 – Brandon 2012-08-14 18:26:37

回答

1

我怀疑的是,在C#应用程序文件写入没有完成承诺你的C盘前++应用程序试图读取它。在调用writer.Close()之前,你可以尝试添加writer.Flush(),看看它是否有任何区别。