Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Программа на с++ не может открыть файл через cmd. Как исправить?

ike jnec Ученик (126), закрыт 3 дня назад
Пишу программу для сортировки txt файлов по папкам основываясь на содержимом файлов. По задумке, я задаю несколько слов для поиска в файле, и если хотя бы одно из них есть в нём, то файл перемещается в другую папку.

Собственно сам поиск реализовал через команду findstr вместе с _popen(), чтобы перехватить результат команды cmd можно было. По итогу получаю, что findstr не может открыть текстовый файл, хотя даже программу запускаю от имени администратора. Руками получается, а если код исполняет уже не выходит.
Дополнен 1 неделю назад
Не хочу весь код выкладывать поэтому вот рабочий его кусок:
#include <iostream>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <memory>
#include <array>
#include <fstream>

using namespace std;

int main() {
char psBuffer[128];
FILE* pPipe;
string tmp_com = "findstr ";
string comn2 = "";
string comn = "";
ifstream inputFile("D:\\Downloads\\ vk.com \\flist.txt");
string selectedString;
string tmpstr = "";

system("cd D:\\Downloads\\ vk.com \\1");

if ( inputFile.is _open()) {
cout << "list of files is open!" << endl;
getline(inputFile, selectedString);

comn.append("findstr \"1girl\" ").append(selectedString);

if ((pPipe = _popen(comn.c_str(), "rt")) != NULL) {
fgets(psBuffer, 128, pPipe);
tmpstr = string(psBuffer);

int endOfFileVal = feof(pPipe);
int closeReturnVal = _pclose(pPipe);
}
else {
cout << "0000x0000" << endl;
}
}
else {
cerr << "errn" << endl;
exit;
}
system("pause");

}
Дополнен 1 неделю назад
D:\\Downloads\\ vk.com \\1 - это папка с файлами
D:\\Downloads\\ vk.com \\flist.txt - это файл c результатом вывода команды "dir /a:-d /b *.txt"
Лучший ответ
Def Просветленный (37433) 1 неделю назад
А кто ж без исходника или его части, открывающей файлы, знает, кроме тебя - каких именно ошибок ты туда насадил? Ну и из постановки задачи совершенно непонятно, зачем здесь нужен вызов cmd.

Неправильно сформировал команду, неправильно склеил путь, не учёл работу с кодировками и т.д., тысячи их...
ike jnecУченик (126) 1 неделю назад
Дополнил
Def Просветленный (37433) ike jnec, пробелы, в имени каталога, надеюсь, добавили ответы...
 comn.append("findstr \"1girl\"").append("D:\\Downloads\\vk.com\\").append(selectedString); 
Нужно указывать полный путь к файлу, D:\\Downloads\\ vk.com \\1 - это папка с файлами - в программе данный факт никак не используется, в findstring ищется строка 1girl
DefПросветленный (37433) 1 неделю назад
 comn.append("findstr \"1girl\" ").append("D:\\Downloads\\vk.com\\1\\").append(selectedString); 
Вот так точнее, выше пробел исчез
ike jnec Ученик (126) Def, действительно теперь нет сообщения об ошибке. Ну и про cd буду знать.) Спасибо
DefПросветленный (37433) 1 неделю назад
>system("cd D:\\Downloads\\ vk.com \\1");
Вот такая строка будет менять диск не на все операционках, на старых нужно разделять смену директории и диска, типа такого:
 D: && cd \Path 
DefПросветленный (37433) 1 неделю назад
Ну и команда cd будет менять директорию только для вызываемой сессии, а не для программы. Для программы она меняется через
std::filesystem::current_path(path);
Остальные ответы
Jurijus Zaksas Искусственный Интеллект (426239) 1 неделю назад
Без кода ни фига непонятно, вангую, что ты пытаешься скопировать файл, открытый твоей программой.
Не делай так, не используй внешние утилиты. В С++ есть все, чтобы работать с файлами самостоятельно.
ike jnecУченик (126) 1 неделю назад
Дополнил
Похожие вопросы