2010-05-07 74 views
0

我的代碼不會工作,idk爲什麼。我的代碼的重點是找到頂部窗口並保存一個文本文件,其名稱與頂部菜單欄上的文本相同(任務欄,我認爲?)。然後將一些數據保存到該文本文件。但每次我嘗試使用它,寫入失敗,如果我手動設置文本文件的名稱,所以它不會改變它會將數據寫入文件。但如果我沒有把它放在手邊,它會使文本文件,但不寫任何東西。或者有時它只會爲名稱編寫數字(我認爲它是句柄編號),然後它會寫入數據。 :\奇怪的是任何人都可以幫忙嗎?找到窗口文本並將txt保存到不能工作的文件

#include <iostream> 
#include <windows.h> 
#include <fstream> 
#include <string> 
#include <sstream> 
#include <time.h> 

using namespace std; 

string header_str = ("NULL"); 

#define DTTMFMT "%Y-%m-%d %H:%M:%S " 
#define DTTMSZ 21 

char buff[DTTMSZ]; 
fstream filestr; 

string ff = ("C:\\System logs\\txst.txt"); 
TCHAR buf[255]; 


int main() 
{ 
      GetWindowText(GetForegroundWindow(), buf, 255); 

      stringstream header(stringstream::in |         stringstream::out); 
      header.flush(); 

      header << ("C:\\System logs\\"); 
      header << buf; 
      header << (".txt"); 

      header_str = header.str(); 

      ff = header_str; 

      cout << header_str << "\n"; 

      filestr.open (ff.c_str(), fstream::in | fstream::out |         fstream::app | ios_base::binary | ios_base::out); 
      filestr << "dfg"; 
      filestr.close(); 

      Sleep(10000); 

      return 0; 
    } 

回答

1

您並未清理文本文件的名稱。有相當多的非法文件名稱。主要是,文件名中不允許使用「:」,「/」和「\」等字符。

0

您可能正在以unicode模式編譯您的應用程序。所以buf實際上是wchar_t[255],並且當您執行header<<buf時,實際上輸出指針值buf而不是其內容,因爲header是非Unicode字符串流,不知道如何寫入unicode緩衝區。

您可以將應用程序編譯爲非Unicode(在常規項目設置中,將字符集設置爲多字節),或者使用unicode替代字符串流和fstream(wstringstream,wfstream)。

這是問題的主要原因。另外,theatrus正確的是需要從文件名中刪除非法字符,並且您還應該檢查GetForegroundWindow是否返回NULL或者GetWindowText是否返回空字符串。

0

包含窗口標題的緩衝區是TCHAR類型的。在Visual C++中,當_UNICODE預處理器宏被定義時,TCHAR擴展爲鍵入wchar_t(我相信這是默認設置)。然後使用非廣泛版本的stringstream,它將何時將wchar_t *轉換爲指針值的字符串表示而不是緩衝區的字符串內容。

你有2種選擇:

  1. 將設置更改爲不使用 「Unicode字符集」。 (在「常規項目設置」下查找)。
  2. 使用wstringstreamwfstream而不是stringstream和fstream。這些將與wchar_t一起使用。
+0

即時使用多字節字符,但有些窗口仍然失敗 :\但有些它會保存數據,但有一些它會 – blood 2010-05-07 04:15:29

相關問題