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

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

05.07.2015, 10:20. Показов 3026. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.07.2015, 10:20
Ответы с готовыми решениями:

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

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

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

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

33
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
08.07.2015, 09:22 21
Лучший ответ Сообщение было отмечено VoltDeMar как решение

Решение

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

Решение

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

Решение

До
C++
1
wchar_t* Buffer = new wchar_t[p.length()];
C++
1
p += '\0';
Но не знаю, поможет или нет, проще мне весь проект Ваш посмотреть, ибо долго уже с этой проблемой разбираемся)
1
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
11.07.2015, 12:20  [ТС] 25
Цитата Сообщение от Nkey Посмотреть сообщение
У вас p как параметр передается, попробуйте закрывать его заранее до передачи p += '\0';
Это помогло! Но почему ?
0
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
11.07.2015, 12:28 26
Цитата Сообщение от VoltDeMar Посмотреть сообщение
Это помогло! Но почему ?
Потому что посылалась незакрытая строка? И как следствие лишние символы
0
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
11.07.2015, 12:34  [ТС] 27
...
0
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
11.07.2015, 12:36 28
'\0' - конец строки
1
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
11.07.2015, 12:45  [ТС] 29
Цитата Сообщение от Nkey Посмотреть сообщение
Потому что посылалась незакрытая строка? И как следствие лишние символы
std::string не содержит закрывающего символа? Возможны случая в которых бы этот алгоритм срабатывал бы без такого добавления в конце?
0
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
11.07.2015, 12:51 30
В данном посте я Вам показывал код, в котором у меня срабатывало корректно при использовании std::string.
Возможно так происходило, потому что передавалось через параметр в функцию, хотя адрес тот же..
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
11.07.2015, 14:35 31
Цитата Сообщение от Nkey Посмотреть сообщение
C++
1
2
string p; 
scanf("%s",&p);
Это невероятно неправильно. Так делать ни в коем случае нельзя.
0
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
11.07.2015, 14:39 32
Цитата Сообщение от DrOffset Посмотреть сообщение
Это невероятно неправильно. Так делать ни в коем случае нельзя.
Просто сделал ввод по привычке, а как правильно тогда?
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
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;
}
1
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
11.07.2015, 15:03 34
Цитата Сообщение от DrOffset Посмотреть сообщение
Использовать std::cin для для ввода std::string.
Кстати да, проглядел я чего-то
0
11.07.2015, 15:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.07.2015, 15:03
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru