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

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

05.07.2015, 10:20. Показов 3918. Ответов 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
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
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
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
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
Ответ Создать тему
Новые блоги и статьи
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru