найти текст окна и сохранить текст в файл с именем, который не будет работать - PullRequest
0 голосов
/ 07 мая 2010

мой код не будет работать и почему. смысл моего кода - найти верхнее окно и сохранить текстовый файл с именем, совпадающим с текстом в верхней строке меню (панель задач, мне кажется?). затем сохраните некоторые данные в этот текстовый файл. но каждый раз, когда я пытаюсь использовать его, запись завершается неудачей, если я заранее установил имя текстового файла, поэтому он не изменится, и данные будут записаны в файл. но если я не установлю это перед рукой, это сделает текст документа, но ничего не напишет к нему. или иногда он просто пишет цифры для имени (я думаю, что это номер дескриптора), а затем записывает данные. : \ странно может кто-нибудь помочь?

 #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;
  }

Ответы [ 3 ]

1 голос
/ 07 мая 2010

Вы не очищаете имя вашего текстового файла. Есть довольно много незаконных имен файлов. Прежде всего, такие символы, как «:», «/» и «\», не допускаются в имени файла.

0 голосов
/ 07 мая 2010

Ваш буфер, содержащий заголовок окна, имеет тип TCHAR. В Visual C ++ TCHAR расширяется до типа wchar_t, когда определен макрос препроцессора _UNICODE (я считаю, что это настройка по умолчанию). Затем вы используете неширокую версию stringstream, которая преобразует wchar_t * в строковое представление значения указателя, а не в строковое содержимое буфера.

У вас есть 2 варианта:

  1. Измените настройки, чтобы не использовать «Набор символов Юникода». (Смотрите в общих настройках проекта).
  2. Используйте wstringstream и wfstream вместо stringstream и fstream. Они будут работать с wchar_t.
0 голосов
/ 07 мая 2010

Вы, вероятно, компилируете свое приложение в режиме Unicode. Таким образом, buf на самом деле wchar_t[255], и когда вы выполняете header<<buf, вы фактически выводите значение указателя buf вместо его содержимого, так как header является потоком не-Unicode и не знает, как записывать буферы Юникода.

Вы можете скомпилировать свое приложение как не-юникод (в общих настройках проекта установите многобайтовый набор символов) или использовать альтернативы юникода для stringstream и fstream (wstringstream, wfstream).

Это основная причина проблемы. Кроме того, theatrus прав насчет необходимости удалять недопустимые символы из имени файла, и вам также следует проверить, вернул ли GetForegroundWindow NULL или GetWindowText вернула пустую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...