【问题标题】:Getline with WinApi - Using WOFSTREAM / WIFSTREAM - C++ / WIN32Getline 与 WinApi - 使用 WOFSTREAM / WIFSTREAM - C++ / WIN32
【发布时间】:2015-10-15 00:46:50
【问题描述】:

我使用的是 Windows 10 (Visual Studio 2015)。

好吧,我只想说我正在使用编辑框让用户编写目录、应用程序名称、组合框名称,然后让 wofstream 将目录、应用名称、组合框名称输出到 .txt 文件中。

我的问题是某些目录有空格,所以当 wifstream 读取这些空格时,然后将目录截断到早期并将截断的版本存储到 wchar_t 变量之一中。

程序需要做的(我不确定是否可能)是逐行输出。

例子:

C:\Program Files (x86)\Minecraft

MinecraftLauncher

我的世界

然后使用 getline 读取包括空格在内的整行,将该行存储到变量中,然后获取下一行。 (但它也不能抓取任何不在目录中的额外空格,否则它将无法工作)你们可能知道目录是如何工作的,哈哈)

所以你们不必那么努力,我希望在 IDB_CLICK_ME 的情况下发生这种情况。

这是我目前的代码,在我决定将其添加到我的主应用程序之前我正在修改:

这是我试图读取文件的地方(没有空格)

case WM_CREATE:
    {


        wchar_t testData[20] = L"Hai";
        CreateWindow(L"button", L"CLICK ME", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 5, 5, 200, 25, hwnd, (HMENU)IDB_CLICK_ME, NULL, NULL);
        comboBox = CreateWindow(L"combobox", L" ", WS_VISIBLE | WS_CHILD | CBS_DROPDOWNLIST, 5, 50, 100, 100, hwnd, (HMENU)4, NULL, NULL);
        hProgramName = CreateWindow(L"edit", L"Program Name", WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL, 5, 100, 200, 25, hwnd, NULL, NULL, NULL);
        hProgramDirectory = CreateWindow(L"edit", L"Program Directory", WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL, 5, 130, 200, 25, hwnd, NULL, NULL, NULL);
        hProgramNameComboBox = CreateWindow(L"edit", L"Name listed in ComboBox", WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL, 5, 160, 200, 25, hwnd, NULL, NULL, NULL);
        std::wifstream myfile;
        myfile.open("LaunchLocations.txt");
        myfile >> std::noskipws >> gameLaunchtest.directory;
        myfile >> std::noskipws >> gameLaunchtest.AppName;
        myfile >> std::noskipws >> gameLaunchtest.ComboBoxName;

这是我写它的地方,到目前为止它工作正常

    ComboBox_AddString(comboBox, gameLaunchtest.directory);
    break;


        case WM_COMMAND:
            switch (LOWORD(wparam))
            {
            case IDB_CLICK_ME:
                    GetWindowText(hProgramDirectory, gameLaunchtest.directory, MAX_PATH);
            GetWindowText(hProgramName, gameLaunchtest.AppName, MAX_PATH);
            GetWindowText(hProgramNameComboBox, gameLaunchtest.ComboBoxName, MAX_PATH);
            wofstream launchLocations;
            launchLocations.open("LaunchLocations.txt");
            launchLocations << gameLaunchtest.directory << endl;
            launchLocations << gameLaunchtest.AppName << endl;
            launchLocations << gameLaunchtest.ComboBoxName << endl;
            launchLocations.close();

【问题讨论】:

  • 次要点:MAX_PATH 可能是路径最大长度的更好选择。至于问题,是否只是如何将一行写入输出流?这与“hello world”程序中的发生方式相同:cout &lt;&lt; "Hello world\n"
  • @ roeland 更多关于如何使用空格(直到最后一个字符)来阅读它,因为如果在目录末尾添加额外的空格,您可能会猜到会有多少失败.
  • std::getline 读取一行。主要问题是设置流以对外部数据使用 UTF-8。为此,您需要使用一些 Visual C++ 库扩展,例如 _setmode IIRC(MingW g++ 也支持它们)。
  • 您应该尝试将您的代码减少到您实际遇到问题的部分,即IDB_CLICK_ME 案例中的几行。 → 见MCVE。并包含您尝试读回该文件的代码。
  • @roeland 我把它缩短了一点,希望对你有帮助:)

标签: c++ winapi fstream getline


【解决方案1】:

所以我解决问题的方式(一些非常帮助的成员告诉我,我必须使用 wifstream getline 而不是字符串 getline)

    std::wifstream myfile;
    while (myfile.getline(test[number].directory, 100))
        {
            myfile.getline(test[number].AppName, 100);
            myfile.getline(test[number].ComboBoxName, 100);
            test[number].ID;
            ComboBox_AddString(comboBox, test[number].ComboBoxName);
            number++;
            test[number].ID = test[number].ID + 1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-30
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    相关资源
    最近更新 更多