Форум программистов, компьютерный форум 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
Сообщений: 268
05.07.2015, 12:11     Список файлов и конкатенация строк #2
После ввода символов, может стоит закрывать строку '\0' ?
Обязательно WinAPI нужно?
Я на билдере делал так:
C++
1
2
3
4
5
6
7
8
9
10
11
    TSearchRec SR; // Объявляем переменную для поиска
    AnsiString Path = "Base\\"; // Объявляем путь
    AnsiString FileName = "*.s3db"; // Объявляем любое имя файла БД
 
    if (FindFirst(Path + FileName, faAnyFile, SR) == 0) { // Начинаем искать
        do {
            baseComboBox->Items->Add(SR.Name);
        }
        while (FindNext(SR) == 0); // Пока не кончатся файлы
        FindClose(SR); // Завершаем поиск
    }
VoltDeMar
 Аватар для VoltDeMar
16 / 16 / 0
Регистрация: 05.06.2012
Сообщений: 1,015
05.07.2015, 12:53  [ТС]     Список файлов и конкатенация строк #3
Цитата Сообщение от Nkey Посмотреть сообщение
После ввода символов, может стоит закрывать строку '\0' ?
www.cplusplus.com
wcsncat

wchar_t* wcsncat (wchar_t* destination, const wchar_t* source, size_t num);

Append characters from wide string
Appends the first num wide characters of source to destination, plus a terminating null wide character.
Цитата Сообщение от Nkey Посмотреть сообщение
Я на билдере делал так:
В VS такое можно написать?
Nkey
308 / 61 / 10
Регистрация: 21.12.2011
Сообщений: 268
05.07.2015, 13:07     Список файлов и конкатенация строк #4
wcsncat - конкатенация двух строк широких символов

СИНТАКСИС

#include <wchar.h>
wchar_t *wcsncat(wchar_t *dest, const wchar_t *src, size_t n);

ОПИСАНИЕ

Функция wcsncat является эквивалентом функции strncat для широких символов. Она копирует минимум n широких символов строки, на которую указывает src, в конец строки широких символов, на которую указывает dest, добавляя к ней конечный символ L'\0'.
Строки не должны перекрываться.

Программист должен убедиться, что в dest достаточно места, по меньшей мере, для wcslen(dest)+n+1 широких символов.

ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ

wcsncat возвращает dest.
У Вас wcsncat после расширения файла добавляет конец строки, после введенных символов, введенными пользователем она не добавляет, нужно ручками.

Можно попробовать сделать так, т.к. в описании написано +1.
C++
1
wchar_t* Buffer = new wchar_t[p.length()+1];
На VS немного по другому делается. Вот пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
    // the input pattern and output struct      
    char *pattern = "s*"; // Маска
    struct _finddata_t fileinfo;
 
    // first file (sample1.txt)
    int x = _findfirst(pattern, &fileinfo);
    printf("%s" ,fileinfo.name);
 
    // next file (sample2.txt)
    _findnext(x, &fileinfo);
    printf("%s" ,fileinfo.name);
 
}
VoltDeMar
 Аватар для VoltDeMar
16 / 16 / 0
Регистрация: 05.06.2012
Сообщений: 1,015
06.07.2015, 09:28  [ТС]     Список файлов и конкатенация строк #5
Цитата Сообщение от Nkey Посмотреть сообщение
У Вас wcsncat после расширения файла добавляет конец строки, после введенных символов, введенными пользователем она не добавляет, нужно ручками.
О чем тут написано?

Хотелось бы в своем коде разобраться.
Что нужно подключить чтобы заработал этот код?
Цитата Сообщение от Nkey Посмотреть сообщение
int main() { // the input pattern and output struct char *pattern = "s*"; // Маска struct _finddata_t fileinfo; // first file (sample1.txt) int x = _findfirst(pattern, &fileinfo); printf("%s" ,fileinfo.name); // next file (sample2.txt) _findnext(x, &fileinfo); printf("%s" ,fileinfo.name); }
Nkey
308 / 61 / 10
Регистрация: 21.12.2011
Сообщений: 268
06.07.2015, 12:21     Список файлов и конкатенация строк #6
Почему используете wchar, а не char?

Добавлено через 10 минут
wcsncat - конкатенирует две строки, первый аргумент куда, второй что, третий длину, почему вы используете sizeof, а не длину строки?

Я ваш код взял, изменил только на char, ибо у меня на билдере FindFirstFile требует char. Выводит список файлов.
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
int main()
{
    char *p = new char;
    cin >> p;
    vector<string> Files(0); // вектор с файлами
    char* Buffer = new char[strlen(p)] ; // создание массива символов для приведения типа переменной пути
 
    Buffer = strcpy(Buffer, p);
    Buffer = strcat(Buffer, "\\*.*");
 
    //mbstowcs(Buffer, p.c_str(), p.length());   // преобразование переменной в массив widechar
    //Directories.emplace_back(p); // занесение введенного пользователем пути в массив-
    //wcsncat(Buffer, L"\\*.*", sizeof(L"\\*.*"));
 
    WIN32_FIND_DATA 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"); // переводим программу в режим ожидания
    }
    else
    {
        do {
            cout << FindFileData.cFileName << endl;
        } while(FindNextFile(hf, &FindFileData));
        FindClose(hf);
    }
    system("pause");
   //getchar();
   return 0;
}
VoltDeMar
 Аватар для VoltDeMar
16 / 16 / 0
Регистрация: 05.06.2012
Сообщений: 1,015
06.07.2015, 15:58  [ТС]     Список файлов и конкатенация строк #7
Цитата Сообщение от Nkey Посмотреть сообщение
Я ваш код взял, изменил только на char, ибо у меня на билдере FindFirstFile требует char. Выводит список файлов.
У меня Юникод в свойствах проекта стоит, наверное это причина того что вызывается FindFirstFileW .
Цитата Сообщение от Nkey Посмотреть сообщение
почему вы используете sizeof, а не длину строки?
А это неправильно?
Nkey
308 / 61 / 10
Регистрация: 21.12.2011
Сообщений: 268
06.07.2015, 16:10     Список файлов и конкатенация строк #8
VoltDeMar, sizeof размер возвращает, а не длину.
VoltDeMar
 Аватар для VoltDeMar
16 / 16 / 0
Регистрация: 05.06.2012
Сообщений: 1,015
06.07.2015, 16:12  [ТС]     Список файлов и конкатенация строк #9
Цитата Сообщение от Nkey Посмотреть сообщение
VoltDeMar, sizeof размер возвращает, а не длину.
А L"\\*.*" это массив wchar_t ?
Nkey
308 / 61 / 10
Регистрация: 21.12.2011
Сообщений: 268
06.07.2015, 16:52     Список файлов и конкатенация строк #10
С L да

Добавлено через 35 минут
Вот с wchar_t
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
int main()
{
    char *p = new char;
    cin >> p;
    vector<string> Files(0); // вектор с файлами
    wchar_t* Buffer = new wchar_t[strlen(p)] ; // создание массива символов для приведения типа переменной пути
 
    mbstowcs(Buffer, p, strlen(p));   // преобразование переменной в массив widechar
    //Directories.emplace_back(p); // занесение введенного пользователем пути в массив-
    wcsncat(Buffer, L"\\*.*", sizeof(L"\\*.*"));
 
    WIN32_FIND_DATAW FindFileData; // переменная структуры информации о директории или файле
    HANDLE hf; // переменная под хендл файла
 
    wcout << Buffer << endl;
 
    hf = FindFirstFileW(Buffer, &FindFileData); // поиск первого файла в введенной пользователем директории и занесение в переменную
    if (hf == INVALID_HANDLE_VALUE)
    { // Если хендлер не содержит дескриптор файла или директории
        cout << "Invalid_handle_val \n" << endl; // выводим сообщение
        cout << "What to do?";
        system("pause"); // переводим программу в режим ожидания
    }
    else
    {
        do {
            wprintf(FindFileData.cFileName);
            printf("\n");
        } while(FindNextFileW(hf, &FindFileData));
        FindClose(hf);
    }
    system("pause");
   return 0;
}
VoltDeMar
 Аватар для VoltDeMar
16 / 16 / 0
Регистрация: 05.06.2012
Сообщений: 1,015
06.07.2015, 16:55  [ТС]     Список файлов и конкатенация строк #11
C++
1
wcsncat(Buffer, L"\\*.*", wcslen(L"\\*.*"));
так не помогло
Nkey
308 / 61 / 10
Регистрация: 21.12.2011
Сообщений: 268
06.07.2015, 16:58     Список файлов и конкатенация строк #12
Посмотрите как у меня в примере, sizeof забыл поменять - но работает, но так не надо делать) с wcslen работает
VoltDeMar
 Аватар для VoltDeMar
16 / 16 / 0
Регистрация: 05.06.2012
Сообщений: 1,015
07.07.2015, 09:06  [ТС]     Список файлов и конкатенация строк #13
Цитата Сообщение от Nkey Посмотреть сообщение
Посмотрите как у меня в примере, sizeof забыл поменять - но работает, но так не надо делать) с wcslen работает
У меня не срабатывает. А какой путь Вы передаете?
Nkey
308 / 61 / 10
Регистрация: 21.12.2011
Сообщений: 268
07.07.2015, 11:44     Список файлов и конкатенация строк #14
C: например.

Добавлено через 34 минуты
без слеша
VoltDeMar
 Аватар для VoltDeMar
16 / 16 / 0
Регистрация: 05.06.2012
Сообщений: 1,015
07.07.2015, 12:41  [ТС]     Список файлов и конкатенация строк #15
Вот такое содержание массива, если передаю без слешей, что ещё за элементы в нем могут присутствовать с точки зрения строения переменной такого типа?
Полностью пустой массив тоже содержит что то что отображается как символы, это может быть причиной ошибки?
Миниатюры
Список файлов и конкатенация строк  
Nkey
308 / 61 / 10
Регистрация: 21.12.2011
Сообщений: 268
07.07.2015, 13:30     Список файлов и конкатенация строк #16
Это может быть причиной ошибки.
Обычно так происходит, если строка не закрыта, поставьте точку останова на 5 строке, и посмотрите какие значения принимают p и Buffer.
Как вы считываете значение p?
Также во второй строке значение длины p приходит корректное?
VoltDeMar
 Аватар для VoltDeMar
16 / 16 / 0
Регистрация: 05.06.2012
Сообщений: 1,015
07.07.2015, 13:54  [ТС]     Список файлов и конкатенация строк #17
Цитата Сообщение от Nkey Посмотреть сообщение
Обычно так происходит, если строка не закрыта, поставьте точку останова на 5 строке, и посмотрите какие значения принимают p и Buffer.
Строка p задана в ручную, length возвращает верную длину.
Может ли быть что то со средой или ОС ?
Nkey
308 / 61 / 10
Регистрация: 21.12.2011
Сообщений: 268
08.07.2015, 00:45     Список файлов и конкатенация строк #18
Это не должно влиять.
У вас p изначально wchar_t или char?

Добавлено через 3 минуты
Скорее всего wchar_t, но если с char вводить, то и в mbstowcs просто p можно будет указать, без c_str().
VoltDeMar
 Аватар для VoltDeMar
16 / 16 / 0
Регистрация: 05.06.2012
Сообщений: 1,015
08.07.2015, 08:35  [ТС]     Список файлов и конкатенация строк #19
Цитата Сообщение от Nkey Посмотреть сообщение
У вас p изначально wchar_t или char?
C++
1
std::vector<std::string> CreateFileList(std::string p, std::vector<std::string>& Directories)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2015, 09:09     Список файлов и конкатенация строк
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Nkey
308 / 61 / 10
Регистрация: 21.12.2011
Сообщений: 268
08.07.2015, 09:09     Список файлов и конкатенация строк #20
Изменил на string - корректно работает
C++
1
2
3
4
5
6
7
8
string p;
 
    scanf("%s",&p);
 
    vector<string> Files(0); // вектор с файлами
    wchar_t* Buffer = new wchar_t[p.length()] ; // создание массива символов для приведения типа переменной пути
 
    mbstowcs(Buffer, p.c_str(), p.length());   // преобразование переменной в массив widechar
Так тоже работает:
C++
1
    p = "C:";
Добавлено через 7 минут
У вас p как параметр передается, попробуйте закрывать его заранее до передачи p += '\0';
Yandex
Объявления
08.07.2015, 09:09     Список файлов и конкатенация строк
Ответ Создать тему
Опции темы

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