2012-08-14 97 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(),看看它是否有任何區別。