У меня есть скрипт русской рулетки, написанный на C++. Если два случайно сгенерированных числа совпадают, скрипт удаляет указанный файл.
Люди предложили мне использовать C++17 для использования библиотеки <filesystem>
, чтобы правильно выполнять операции, связанные с файлами. Операция удаления выполняется, если условия совпадают. Блок if
работает правильно, но удаление файла не происходит.
#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <filesystem>
//include filesystem and replace remove() with filesystem libs remove function
using namespace std;
namespace fs = std::filesystem;
int main(){
int minNumber = 1, maxNumber = 6;
int possibility,chamberNumber;
srand(time(0));
possibility = rand() % (maxNumber - minNumber + 1 ) + minNumber;
chamberNumber = rand() % (maxNumber - minNumber + 1 ) + minNumber;
cout << "First Number: " <<possibility<<endl<<"Second Number: " << chamberNumber<< endl;
if (possibility == chamberNumber){
std::filesystem::remove("C:\\Users\\mypath\\Desktop\\cppRoulette\\delete.txt");
cout << "You're Dead " <<possibility<< endl;
}
// else{
// cout << possibility << endl;
// }
return 0;
}
Я использую эту строку для компиляции моего кода:
g++ -std=c++17 rulet.cpp -o output
Вот скриншот скомпилированного вывода. Обратите внимание, "delete.txt"
остается в силе.
Я использую WSL Debian, потому что я использую VS Code, а собственные терминалы не работают должным образом с g++. Хотя плавность Linux мне может нравиться немного больше.
Я ищу правильный и простой способ работы с файлами, как в Python. Я посещаю ускоренный курс C++, поэтому я пытаюсь его изучить, переход на Python не обсуждается.
К вашему сведению, при использовании using namespace std;
нет необходимости в других утверждениях using
.
Скорее всего, путь к файлу, который вы пытаетесь удалить, не совсем тот, который вы там ввели. Тем более, что вы используете WSL, что добавляет дополнительный уровень сложности процессу.
Вы также можете попробовать функцию C remove
, но то, что вызывает сбой кода файловой системы, также, вероятно, приведет к сбою remove
.
Вы можете попробовать заменить C:\\Users\\mypath\\Desktop\\cppRoulette\\delete.txt
на /mnt/c/Users/mypath/Desktop/cppRoulette/delete.txt
. Вы также должны проверить ошибку, которую вы получаете.
родные терминалы не работают должным образом с g++" А? Я бы сосредоточился на этом вопросе.
«родные терминалы не работают должным образом с g++» означает, что я изо всех сил пытаюсь работать с cmd или странностями powershell. @HolyBlackCat
Я понимаю. Я имею в виду, что g++ должен просто работать в любой из этих оболочек, если он добавлен в PATH.
Ваш путь к файлу неверен. Я только что заставил ваш код работать в моей системе, изменив путь с E:\Test\delete.txt
на /mnt/e/Test/delete.txt
.
В WSL все диски Windows (C:
, E:
и т. д.) монтируются в каталоге /mnt
в подкаталогах, соответствующих букве диска (/mnt/c/
, /mnt/e/
и т. д.). Чтобы преобразовать путь Windows для использования в WSL, вам необходимо сделать следующее:
\
) на прямые черты (/
).:
) после буквы диска."/mnt/"
к пути.После этого ваша программа заработает и удалит целевой файл.
Вы также пробовали E:\\Test\\delete.txt
(в коде), который лучше соответствовал бы коду OP? «Замените все обратные косые черты (\
) на обратные косые черты (/)» — нет, это превратит каждый \\
в //
.
@TedLyngmo Нет, потому что \\
в строковом литерале времени компиляции составляет только 1 \
в фактических строковых данных во время выполнения.
О разделителях на разных платформах: см. std::filesystem::path::preferred_separator
@TedLyngmo Да, я пытался E:\\Test\\delete.txt
. Первое, что я сделал, и, как и ожидалось, ничего не сделал. Для WSL этот путь ничего не значит.
что, если вы удалите все случайные числа?