Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Mypowerfulbrain
19 / 19 / 1
Регистрация: 24.07.2013
Сообщений: 121
#1

FindFirstFileW. Как подставить значение переменной типа string в функцию? - C++

12.02.2014, 21:40. Просмотров 1340. Ответов 17
Метки нет (Все метки)

Здравствуйте, форумчане! Будьте добры и помогите понять один нюанс.
Например есть у меня такие строки:
C++
1
2
3
4
5
6
7
8
//*******************************************
string folderpath;
cin >> folderpath;
 
WIN32_FIND_DATAW wfd;
 
HANDLE const hFind = FindFirstFileW(L"C:\\*", &wfd);
//*******************************************
Как мне вместо "C:\\*" подставить значение folderpath? Просто хочется путь к папке вводить вручную, а не каждый раз перед компиляцией.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.02.2014, 21:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос FindFirstFileW. Как подставить значение переменной типа string в функцию? (C++):

Как присвоить переменной типа string значение из файла - C++
Название файла неизвестно, задается пользователем в командой строке при вызове программы. Т.е. Допусти, что мы присвоили переменной ...

Как присвоить переменной типа String значение argv[0]? - C++
Как присвоить переменной типа String значение argv? Заранее спасибо =)

Поменять значение по указанному адресу в переменной типа std::string - C++
Здравствуйте форумчане. Не получается никак правильно использовать средства С++. Задача такова: Например есть две строки типа...

Как текст из заданного файла присвоить переменной типа std::string? - C++
Здравствуйте, у меня есть файл с текстом, нужно этот текст присвоить переменной string, как это сделать? самый простой вариант желательно

Как вывести значение переменной, не зная ее типа? - C++
Необходимо написать универсальный скалярный тип, причем так, чтобы нам не нужно было знать тип переменной при ее выводе. Вот, что я...

Убрать в переменной типа string пробелы - C++
Задача у меня такая. Пользователь вводит текст с консоли. 1.Удалить все пробелы и знаки препинания. 2. Очередную букву в цикле...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
12.02.2014, 22:02 #2
вам нужно либо вводить std::wstring через std::wcin, либо вызывать FindFirstFileA.
и для ваших нужд у строки есть спец метод: c_str
C++
1
2
3
4
5
6
//*******************************************
wstring folderpath;
wcin >> folderpath;
WIN32_FIND_DATAW wfd;
HANDLE const hFind = FindFirstFileW(folderpath.c_str(), &wfd);
//*******************************************
1
Mypowerfulbrain
19 / 19 / 1
Регистрация: 24.07.2013
Сообщений: 121
12.02.2014, 22:42  [ТС] #3
Пути файлов с пробелами не принимает (((
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
setlocale(LC_ALL, "Russian");
 
    cout << "Введите путь к папке (Пример: C:\\*):" << endl;
    wstring folderpath;
    wcin >> folderpath;
 
    WIN32_FIND_DATAW wfd;
 
    HANDLE const hFind = FindFirstFileW(folderpath.c_str(), &wfd);
 
    if (INVALID_HANDLE_VALUE != hFind)
    {
        do
        {
            wcout << &wfd.cFileName[0] << endl;
        } while (NULL != FindNextFileW(hFind, &wfd));
 
        FindClose(hFind);
    }
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
12.02.2014, 22:59 #4
попробуйте обернуть путь в кавычки. одинарные или двойные.
0
Mypowerfulbrain
19 / 19 / 1
Регистрация: 24.07.2013
Сообщений: 121
12.02.2014, 23:11  [ТС] #5
DU, пробовал в кавычках, не принимает все равно. (((
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
12.02.2014, 23:23 #6
msdn пишет, что в начало пути надо засунуть "\\?\".
т.е. в коде:
C++
1
  wstring folderpath = L"\\\\?\\d:\\tmp\\folder with space";
вроде прокатило.
я так понял это будет работать только с FindFirstFileW
вот тут всякие премудрости этого дела:
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
1
Mypowerfulbrain
19 / 19 / 1
Регистрация: 24.07.2013
Сообщений: 121
13.02.2014, 11:33  [ТС] #7
Допустим вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <stdio.h> 
#include <conio.h>
#include <math.h>
#include <windows.h>
#include <string>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    cout << "Введите путь к папке (Пример: C:\\*):" << endl;
    wstring folderpath;
    wcin >> folderpath;
 
    WIN32_FIND_DATAW wfd;
 
    HANDLE const hFind = FindFirstFileW(folderpath.c_str(), &wfd);
 
    if (INVALID_HANDLE_VALUE != hFind)
    {
        do
        {
            wcout << &wfd.cFileName[0] << endl;
        } while (NULL != FindNextFileW(hFind, &wfd));
 
        FindClose(hFind);
    }
 
    system("pause");
    return 0;
}
После запуска программы, в консоли Я ввожу:
Код
\\?\\C:\\Program Files\\*
Но программа сразу выходит на
C++
1
system("pause");
FindFirstFileW. Как подставить значение переменной типа string в функцию?
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,529
Завершенные тесты: 1
13.02.2014, 11:43 #8
Почувствуйте разницу:
Цитата Сообщение от DU Посмотреть сообщение
\\\\?\\
Цитата Сообщение от Mypowerfulbrain Посмотреть сообщение
\\?\\
1
Mypowerfulbrain
19 / 19 / 1
Регистрация: 24.07.2013
Сообщений: 121
13.02.2014, 22:16  [ТС] #9
Так?
Код
\\\\?\\C:\\Program Files\\*
Так не катит тоже (((
FindFirstFileW. Как подставить значение переменной типа string в функцию?
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.02.2014, 22:22 #10
я себе путь захардкодил, чтобы не вбивать каждый раз. в коде это выглядит так:
C++
1
wstring folderpath = L"\\\\?\\d:\\tmp\\folder with space";
слеши удваиваются.
но если вводить путь во время выполнения - то этого удвоения не надо. т.е. вбивать надо
"\\?\d:\tmp\folder with space.

да и это не очень удобно. можно этот префикс не вбивать а подставлять в программе:

C++
1
FindFirstFileW((L"\\\\?\\" + folderpath).c_str(), &wfd);
1
Mypowerfulbrain
19 / 19 / 1
Регистрация: 24.07.2013
Сообщений: 121
13.02.2014, 23:35  [ТС] #11
DU, сделал как вы советовали:
Код
FindFirstFileW((L"\\\\?\\" + folderpath).c_str(), &wfd);
Не видит Program Files (((
FindFirstFileW. Как подставить значение переменной типа string в функцию?
Еще варианты? =)
Еще раз весь код:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <stdio.h> 
#include <conio.h>
#include <math.h>
#include <windows.h>
#include <string>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    cout << "Введите путь к папке (Пример: C:\\*):" << endl;
    wstring folderpath;
    wcin >> folderpath;
 
    WIN32_FIND_DATAW wfd;
 
    HANDLE const hFind = FindFirstFileW((L"\\\\?\\" + folderpath).c_str(), &wfd);
 
    if (INVALID_HANDLE_VALUE != hFind)
    {
        do
        {
            wcout << &wfd.cFileName[0] << endl;
        } while (NULL != FindNextFileW(hFind, &wfd));
 
        FindClose(hFind);
    }
 
    system("pause");
    return 0;
}
0
Stella
75 / 75 / 5
Регистрация: 26.02.2013
Сообщений: 224
14.02.2014, 00:01 #12
Mypowerfulbrain, у меня тоже
C++
1
 wcin >> folderpath;
считывает до первого пробела.

Как вариант может быть так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <conio.h>
#include <math.h>
#include <windows.h>
#include <string>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    cout << "Введите путь к папке (Пример: C:\\*):" << endl;
 
    int PATH_LENGHT = 100;
   
    wchar_t *tmpFolderPath = new wchar_t [PATH_LENGHT];
    wcin.getline(tmpFolderPath, PATH_LENGHT);
    wstring folderpath(tmpFolderPath);
    
    //folderpath = L"\\\\?\\c:\\Program Files\\*";
 
    WIN32_FIND_DATAW wfd;
 
    HANDLE const hFind = FindFirstFileW((L"\\\\?\\" + folderpath).c_str(), &wfd);
 
    if (INVALID_HANDLE_VALUE != hFind)
    {
        do
        {
            wcout << &wfd.cFileName[0] << endl;
        } while (NULL != FindNextFileW(hFind, &wfd));
 
        FindClose(hFind);
    }
 
    system("pause");
    return 0;
}
Хотя макс. длину пути надо задать. Как без этого - не знаю.
1
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
14.02.2014, 00:04 #13
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
так же:
C++
1
2
3
4
wstring folderpath;
//wcin >> folderpath;
std::getline(wcin, folderpath);
wcout << L"Your path: " << folderpath << endl;
2
Stella
75 / 75 / 5
Регистрация: 26.02.2013
Сообщений: 224
14.02.2014, 00:19 #14
DU, точно!!!
спасибки!!!
1
Mypowerfulbrain
19 / 19 / 1
Регистрация: 24.07.2013
Сообщений: 121
16.02.2014, 17:04  [ТС] #15
DU, снова не работает. Проклятье какое-то (((
Код:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <stdio.h> 
#include <conio.h>
#include <math.h>
#include <windows.h>
#include <string>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    cout << "Введите путь к папке (Пример: C:\\*):" << endl;
    wstring folderpath;
    //wcin >> folderpath;
    std::getline(wcin, folderpath);
    wcout << L"Your path: " << folderpath << endl;
 
 
    WIN32_FIND_DATAW wfd;
 
    HANDLE const hFind = FindFirstFileW((L"\\\\?\\" + folderpath).c_str(), &wfd);
 
    if (INVALID_HANDLE_VALUE != hFind)
    {
        do
        {
            wcout << &wfd.cFileName[0] << endl;
        } while (NULL != FindNextFileW(hFind, &wfd));
 
        FindClose(hFind);
    }
 
    system("pause");
    return 0;
}


Не выводит список файлов. Вот результат:
FindFirstFileW. Как подставить значение переменной типа string в функцию?
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.02.2014, 17:04
Привет! Вот еще темы с ответами:

Конвертация переменной типа string в массив int - C++
Добрый день. Есть строка string выглядит следующим образом: string str = &quot;01 07 45 0F 12 00 02 09 10 BA 00 34 33 30 35 32 31 31 33&quot;; ...

Как создать функцию изменяющую значение переменной? - C++
Насколько я понял функция или возвращает значение,или выполняет какие либо действия,но изменить значение можно только у глобальной...

Создание папки с именем, которое находится в переменной типа string - C++
Нужно программно создать папку с именем, которое находится в переменной типа string Пытаюсь сделать так string ident(&quot;name&quot;);...

Присвоить переменной типа string сумму двух других строк - C++
Как это вооплотить? Почему при таком подходе просто зависание String a=&quot;Номер группы - &quot;; String c; Cin&gt;&gt;c; String x={a,c}; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.02.2014, 17:04
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru