Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
1

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

05.07.2015, 10:20. Показов 3148. Ответов 33
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.

В этом коде
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 не работает?
Миниатюры
Список файлов и конкатенация строк  
0
05.07.2015, 10:20
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.07.2015, 10:20
Ответы с готовыми решениями:

Отсортировать список 5-х строк нескольких файлов
из всех файлов каталога / etc выделить 5й строку, собрать все эти строки в один файл и отсортировать его. у меня есть готовый скрипт с...

Конкатенация файлов
Даны два файла; ft:&quot;знак&quot; и f2:&quot;генератор&quot;. Конкатенировать файлы f1 и f2 через букву &quot;о&quot;, записав результат в файл f1. Вывести...

Конкатенация строк
Добрейшего всем ) Не силён в PHP ( Помогите сообразить: Необходимо сгенерировать строки следующего вида в цикле &lt;input...

33
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
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); // Завершаем поиск
    }
1
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
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 такое можно написать?
0
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
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);
 
}
1
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
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); }
0
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
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;
}
1
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
06.07.2015, 15:58  [ТС] 7
Цитата Сообщение от Nkey Посмотреть сообщение
Я ваш код взял, изменил только на char, ибо у меня на билдере FindFirstFile требует char. Выводит список файлов.
У меня Юникод в свойствах проекта стоит, наверное это причина того что вызывается FindFirstFileW .
Цитата Сообщение от Nkey Посмотреть сообщение
почему вы используете sizeof, а не длину строки?
А это неправильно?
0
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
06.07.2015, 16:10 8
VoltDeMar, sizeof размер возвращает, а не длину.
1
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
06.07.2015, 16:12  [ТС] 9
Цитата Сообщение от Nkey Посмотреть сообщение
VoltDeMar, sizeof размер возвращает, а не длину.
А L"\\*.*" это массив wchar_t ?
0
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
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;
}
1
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
06.07.2015, 16:55  [ТС] 11
C++
1
wcsncat(Buffer, L"\\*.*", wcslen(L"\\*.*"));
так не помогло
0
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
06.07.2015, 16:58 12
Посмотрите как у меня в примере, sizeof забыл поменять - но работает, но так не надо делать) с wcslen работает
1
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
07.07.2015, 09:06  [ТС] 13
Цитата Сообщение от Nkey Посмотреть сообщение
Посмотрите как у меня в примере, sizeof забыл поменять - но работает, но так не надо делать) с wcslen работает
У меня не срабатывает. А какой путь Вы передаете?
0
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
07.07.2015, 11:44 14
C: например.

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

Добавлено через 3 минуты
Скорее всего wchar_t, но если с char вводить, то и в mbstowcs просто p можно будет указать, без c_str().
1
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
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)
0
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
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';
1
08.07.2015, 09:09
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.07.2015, 09:09
Помогаю со студенческими работами здесь

Конкатенация строк
Частью задания является реализовать функцию strcat. Возникает какая-то ошибка (см.фото). 1.Вы могли бы подсказать в чём ошибка? 2.Не по...

Конкатенация строк
Разбираю учебный пример - написать класс для работы со строками. Всего два поля: private: int _size; // длина строки, без...

Конкатенация строк
Должно быть консольное приложение. Очень простой вопрос, но сам что-то завис, и немогу найти что хочу. Значит так есть такой кусок кода ...

Конкатенация строк
Добрый вечер. Окажите помощь пожалуйста. Имеется следующий запрос: SELECT q.id AS question_id, a.id AS answer_id FROM questions...

Конкатенация 3 строк
Можно сделать первый вариант $х = $a. $b. $с; но в инете пишут, что быстрее будет если $a .= $b; А как продолжить это выражение...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Опции темы

Новые блоги и статьи
Linux API: Полное руководство
hw_wired 08.02.2025
Linux API – это низкоуровневый программный интерфейс, обеспечивающий взаимодействие пользовательских приложений с ядром операционной системы. Он включает набор системных вызовов, библиотечных функций. . .
Асинхронное программировани­­­­­е и эмуляция async/await в C (СИ)
hw_wired 08.02.2025
Язык программирования C, несмотря на свой возраст, предоставляет неплохие средства для реализации асинхронных операций, позволяя создавать эффективные решения для обработки параллельных задач. В. . .
Как сгенерировать случайное число в указанном диапазоне в JavaScript
bytestream 08.02.2025
В JavaScript генерация случайных чисел основана на детерминированном алгоритме, который создает последовательность псевдослучайных значений. Встроенный метод Math. random() возвращает псевдослучайное. . .
Как получить список всех таблиц в PostgreSQL
bytestream 08.02.2025
PostgreSQL предлагает несколько методов для получения списка таблиц в базе данных. Наиболее распространенный способ - использование системного каталога pg_tables, который содержит информацию обо всех. . .
Java Spring для начинающих
bytestream 08.02.2025
Spring Framework - это универсальное решение для создания корпоративных Java-приложений. Он предоставляет комплексную программную и конфигурационную модель для современных приложений на Java. Spring. . .
Асинхронное программировани­­­­­­е и async/await в Visual Basic
bytestream 08.02.2025
В основе асинхронного программирования в Visual Basic лежит концепция неблокирующего выполнения операций. Когда программа встречает длительную операцию, например, чтение большого файла или запрос к. . .
Async/await и асинхронное программировани­­е в Delphi
bytestream 08.02.2025
Асинхронное программирование является неотъемлемой частью разработки современных приложений, позволяя создавать отзывчивые и эффективные программы. В Delphi реализация асинхронности опирается на. . .
Асинхронное программировани­­­­­е и async/await в C#
bytestream 08.02.2025
Асинхронное программирование - концепция, позволяющая приложениям эффективно выполнять длительные операции без блокировки основного потока выполнения. В контексте современной разработки на C# это. . .
Асинхронное программировани­­­­­е и горутины/каналы в Go
bytestream 08.02.2025
Язык Go изначально разрабатывался с учетом современных многоядерных процессоров и необходимости эффективного параллельного выполнения задач. В отличие от традиционных подходов к асинхронному. . .
Как восстановить stash в Git
hw_wired 08.02.2025
Git stash - это средство для временного сохранения изменений в рабочей директории. В процессе разработки часто возникают ситуации, когда нужно быстро переключиться на другую задачу, но текущие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru