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

Список файлов и конкатенация строк - C++

Восстановить пароль Регистрация
 
 
VoltDeMar
 Аватар для VoltDeMar
16 / 16 / 0
Регистрация: 05.06.2012
Сообщений: 1,015
05.07.2015, 10:20     Список файлов и конкатенация строк #1
Здравствуйте.

В этом коде
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
std::vector<std::string> Files(0); // вектор с файлами                                                 
    wchar_t* Buffer = new wchar_t[p.length()]; // создание массива символов для приведения типа переменной пути
 
    mbstowcs(Buffer, p.c_str(), p.length());   // преобразование переменной в массив widechar   
    Directories.emplace_back(p); // занесение введенного пользователем пути в массив-     
    wcsncat(Buffer, L"\\*.*", sizeof(L"\\*.*"));
 
    WIN32_FIND_DATAW FindFileData; // переменная структуры информации о директории или файле
    HANDLE hf; // переменная под хендл файла
 
    wcout << Buffer << endl;
 
    hf = FindFirstFile(Buffer, &FindFileData); // поиск первого файла в введенной пользователем директории и занесение в переменную 
    if (hf == INVALID_HANDLE_VALUE)
    { // Если хендлер не содержит дескриптор файла или директории
        cout << "Invalid_handle_val \n" << endl; // выводим сообщение 
        cout << "What to do?";
        system("pause"); // переводим программу в режим ожидания
    }
....
FindFirstFile возвращает 0xffffffff.
При вводе пути С:\ после катенации должна получиться строка с фильтром, но вывод wcout возвращает C:\, при этом среда показывает что фильтр добавлен в массив и между введенным путем и символом какие то промежуточные символы. Что возвращает функция wcsncat ? Что означают эти символы? Почему wcout не показывает всё содержимое массива? И почему FindFirstFile не работает?
Миниатюры
Список файлов и конкатенация строк  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2015, 10:20     Список файлов и конкатенация строк
Посмотрите здесь:

C++ Конкатенация строк
C++ Конкатенация строк
Конкатенация строк C++
Конкатенация строк C++
Конкатенация строк C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nkey
308 / 61 / 10
Регистрация: 21.12.2011
Сообщений: 267
08.07.2015, 09:22     Список файлов и конкатенация строк #21
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Да, строка имеет символы как у вас, но показывается без них, так как \0 введен ставится сам после ввода значения переменной. length() выдает верную длину.
mbstowcs обрезает эти символы, и делает нормальный вид. После работает нормально конкатенация.
На строке, которую вы показывали - всё нормально.
Миниатюры
Список файлов и конкатенация строк  
Изображения
 
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nkey
308 / 61 / 10
Регистрация: 21.12.2011
Сообщений: 267
08.07.2015, 09:29     Список файлов и конкатенация строк #22
Сообщение было отмечено автором темы, экспертом или модератором как ответ
В данный момент, те же проблемы, что и изначально были?
VoltDeMar
 Аватар для VoltDeMar
16 / 16 / 0
Регистрация: 05.06.2012
Сообщений: 1,015
09.07.2015, 12:24  [ТС]     Список файлов и конкатенация строк #23
Цитата Сообщение от Nkey Посмотреть сообщение
У вас p как параметр передается, попробуйте закрывать его заранее до передачи p += '\0';
А как это сделать?
Nkey
308 / 61 / 10
Регистрация: 21.12.2011
Сообщений: 267
10.07.2015, 02:04     Список файлов и конкатенация строк #24
Сообщение было отмечено автором темы, экспертом или модератором как ответ
До
C++
1
wchar_t* Buffer = new wchar_t[p.length()];
C++
1
p += '\0';
Но не знаю, поможет или нет, проще мне весь проект Ваш посмотреть, ибо долго уже с этой проблемой разбираемся)
VoltDeMar
 Аватар для VoltDeMar
16 / 16 / 0
Регистрация: 05.06.2012
Сообщений: 1,015
11.07.2015, 12:20  [ТС]     Список файлов и конкатенация строк #25
Цитата Сообщение от Nkey Посмотреть сообщение
У вас p как параметр передается, попробуйте закрывать его заранее до передачи p += '\0';
Это помогло! Но почему ?
Nkey
308 / 61 / 10
Регистрация: 21.12.2011
Сообщений: 267
11.07.2015, 12:28     Список файлов и конкатенация строк #26
Цитата Сообщение от VoltDeMar Посмотреть сообщение
Это помогло! Но почему ?
Потому что посылалась незакрытая строка? И как следствие лишние символы
VoltDeMar
 Аватар для VoltDeMar
16 / 16 / 0
Регистрация: 05.06.2012
Сообщений: 1,015
11.07.2015, 12:34  [ТС]     Список файлов и конкатенация строк #27
...
Nkey
308 / 61 / 10
Регистрация: 21.12.2011
Сообщений: 267
11.07.2015, 12:36     Список файлов и конкатенация строк #28
'\0' - конец строки
VoltDeMar
 Аватар для VoltDeMar
16 / 16 / 0
Регистрация: 05.06.2012
Сообщений: 1,015
11.07.2015, 12:45  [ТС]     Список файлов и конкатенация строк #29
Цитата Сообщение от Nkey Посмотреть сообщение
Потому что посылалась незакрытая строка? И как следствие лишние символы
std::string не содержит закрывающего символа? Возможны случая в которых бы этот алгоритм срабатывал бы без такого добавления в конце?
Nkey
308 / 61 / 10
Регистрация: 21.12.2011
Сообщений: 267
11.07.2015, 12:51     Список файлов и конкатенация строк #30
В данном посте я Вам показывал код, в котором у меня срабатывало корректно при использовании std::string.
Возможно так происходило, потому что передавалось через параметр в функцию, хотя адрес тот же..
DrOffset
6450 / 3824 / 885
Регистрация: 30.01.2014
Сообщений: 6,618
11.07.2015, 14:35     Список файлов и конкатенация строк #31
Цитата Сообщение от Nkey Посмотреть сообщение
C++
1
2
string p; 
scanf("%s",&p);
Это невероятно неправильно. Так делать ни в коем случае нельзя.
Nkey
308 / 61 / 10
Регистрация: 21.12.2011
Сообщений: 267
11.07.2015, 14:39     Список файлов и конкатенация строк #32
Цитата Сообщение от DrOffset Посмотреть сообщение
Это невероятно неправильно. Так делать ни в коем случае нельзя.
Просто сделал ввод по привычке, а как правильно тогда?
DrOffset
6450 / 3824 / 885
Регистрация: 30.01.2014
Сообщений: 6,618
11.07.2015, 15:02     Список файлов и конкатенация строк #33
Цитата Сообщение от Nkey Посмотреть сообщение
Просто сделал ввод по привычке, а как правильно тогда?
Использовать std::cin для для ввода std::string. scanf при чтении строки должен писать в буфер char достаточного размера. У тебя же вообще передан адрес переменной string, а буфер std::string лежит в динамической памяти. То, что у тебя якобы заработало - это только видимость, повезло. Введи ты строку чуть подлиннее и получил бы падение.

Добавлено через 1 минуту
Чуть подправил код из первого поста.
Кликните здесь для просмотра всего текста
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 <vector>
#include <string>
#include <windows.h>
#include <fcntl.h>
#include <io.h>
 
int _tmain(int argc, _TCHAR* argv[])
{
    _setmode(_fileno(stdin), _O_U16TEXT);
    _setmode(_fileno(stdout), _O_U16TEXT);
 
    std::vector<std::wstring> Files; // вектор с файлами
    std::vector<std::wstring> Directories; // вектор с директориями
 
    std::wstring path;
    if (std::getline(std::wcin, path))
    {
        Directories.emplace_back(path);
 
        path += L"\\*.*";
 
        std::wcout << path << std::endl;
 
        WIN32_FIND_DATA FindFileData; // переменная структуры информации о директории или файле
        HANDLE hf = FindFirstFile(path.c_str(), &FindFileData); // поиск первого файла в введенной пользователем директории и занесение в переменную 
        if (hf == INVALID_HANDLE_VALUE)
        { // Если хендлер не содержит дескриптор файла или директории
            
            //.....
        }
        else
        {
            std::wcout << "Filename: " << FindFileData.cFileName << std::endl;
        }
    }
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2015, 15:03     Список файлов и конкатенация строк
Еще ссылки по теме:

C++ Конкатенация строк
Конкатенация строк C++
C++ Конкатенация строк

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

Или воспользуйтесь поиском по форуму:
Nkey
308 / 61 / 10
Регистрация: 21.12.2011
Сообщений: 267
11.07.2015, 15:03     Список файлов и конкатенация строк #34
Цитата Сообщение от DrOffset Посмотреть сообщение
Использовать std::cin для для ввода std::string.
Кстати да, проглядел я чего-то
Yandex
Объявления
11.07.2015, 15:03     Список файлов и конкатенация строк
Ответ Создать тему
Опции темы

Текущее время: 02:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru