Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020

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

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

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

В этом коде
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
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
08.07.2015, 09:22
Лучший ответ Сообщение было отмечено VoltDeMar как решение

Решение

Студворк — интернет-сервис помощи студентам
Да, строка имеет символы как у вас, но показывается без них, так как \0 введен ставится сам после ввода значения переменной. length() выдает верную длину.
mbstowcs обрезает эти символы, и делает нормальный вид. После работает нормально конкатенация.
На строке, которую вы показывали - всё нормально.
Миниатюры
Список файлов и конкатенация строк  
Изображения
 
1
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
08.07.2015, 09:29
Лучший ответ Сообщение было отмечено VoltDeMar как решение

Решение

В данный момент, те же проблемы, что и изначально были?
1
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
09.07.2015, 12:24  [ТС]
Цитата Сообщение от Nkey Посмотреть сообщение
У вас p как параметр передается, попробуйте закрывать его заранее до передачи p += '\0';
А как это сделать?
0
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
10.07.2015, 02:04
Лучший ответ Сообщение было отмечено VoltDeMar как решение

Решение

До
C++
1
wchar_t* Buffer = new wchar_t[p.length()];
C++
1
p += '\0';
Но не знаю, поможет или нет, проще мне весь проект Ваш посмотреть, ибо долго уже с этой проблемой разбираемся)
1
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
11.07.2015, 12:20  [ТС]
Цитата Сообщение от Nkey Посмотреть сообщение
У вас p как параметр передается, попробуйте закрывать его заранее до передачи p += '\0';
Это помогло! Но почему ?
0
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
11.07.2015, 12:28
Цитата Сообщение от VoltDeMar Посмотреть сообщение
Это помогло! Но почему ?
Потому что посылалась незакрытая строка? И как следствие лишние символы
0
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
11.07.2015, 12:34  [ТС]
...
0
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
11.07.2015, 12:36
'\0' - конец строки
1
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
11.07.2015, 12:45  [ТС]
Цитата Сообщение от Nkey Посмотреть сообщение
Потому что посылалась незакрытая строка? И как следствие лишние символы
std::string не содержит закрывающего символа? Возможны случая в которых бы этот алгоритм срабатывал бы без такого добавления в конце?
0
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
11.07.2015, 12:51
В данном посте я Вам показывал код, в котором у меня срабатывало корректно при использовании std::string.
Возможно так происходило, потому что передавалось через параметр в функцию, хотя адрес тот же..
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
11.07.2015, 14:35
Цитата Сообщение от Nkey Посмотреть сообщение
C++
1
2
string p; 
scanf("%s",&p);
Это невероятно неправильно. Так делать ни в коем случае нельзя.
0
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
11.07.2015, 14:39
Цитата Сообщение от DrOffset Посмотреть сообщение
Это невероятно неправильно. Так делать ни в коем случае нельзя.
Просто сделал ввод по привычке, а как правильно тогда?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
11.07.2015, 15:02
Цитата Сообщение от 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;
}
1
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
11.07.2015, 15:03
Цитата Сообщение от DrOffset Посмотреть сообщение
Использовать std::cin для для ввода std::string.
Кстати да, проглядел я чего-то
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.07.2015, 15:03
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru