Удаление данных из файла в C++

Я не уверен, почему, если я сохраню имя файла в переменной «имя_файла», оно не удалит и не переименует его. Он не позволяет мне его запустить, есть ли в этом причина?

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main (){
    string line;
    string f_user;
    string l_user;
    string book;


    cout<< "What is your first name?";
    cin >> f_user;
    cout<< "What is your last name?";
    cin >> l_user;
    string file_name= f_user + l_user + ".txt";

    cout << "What book would you like to return"<< endl;
    cin >> book;
    fstream writedata;
    fstream readdata;
    writedata.open(file_name);
    readdata.open("temp.txt");

    while (getline(writedata,line)){
        if (line != book){
            readdata << line << endl;
            cout << "Book Returned"<< endl;
            writedata.close();
            readdata.close();            
            remove(file_name);
            rename("temp.txt",file_name);
        }
    }
}

Виноват! Я забыл его добавить, так как это часть более крупной программы.

seraphim 01.06.2024 21:34

Ничто в этом коде не нуждается в дополнительных вещах, которые делает std::endl. Используйте '\n', чтобы завершить строку, если нет веской причины не делать этого. В частности, запись std::endl в файл снижает производительность.

Pete Becker 01.06.2024 21:51

Примечание: выработайте привычку инициализировать объекты значимыми значениями, а не инициализировать их по умолчанию и немедленно перезаписывать значения по умолчанию. В данном случае это означает замену fstream writedata; fstream readdata; writedata.open(file_name); readdata.open("temp.txt"); на fstream writedata(file_name); readdata("temp.txt");.

Pete Becker 01.06.2024 21:53

Кроме того, файл, в который вы только пишете, должен быть std::ofstream, а файл, из которого вы только читаете, должен быть std::ifstream.

Pete Becker 01.06.2024 21:54

Логика цикла выглядит неправильно; когда ввод соответствует book, он закрывает файлы, удаляя все, что еще не было прочитано.

Pete Becker 01.06.2024 21:56

И пока я придираюсь к вам: не должен ли writedata быть выходной файл, а readdata входной файл? Очень сложно читать из файла с именем write... и записывать в файл с именем read....

Pete Becker 01.06.2024 21:58

Вы забыли std::ios::out для выходного файла? См. std::basic_fstream::open. Вам следует использовать ifstream и ofstream.

David C. Rankin 01.06.2024 22:14

@DavidC.Rankin Как указано в предоставленной вами ссылке, std::ios::out является значением по умолчанию для std::fstream, так же, как std::ios::in.

Yksisarvinen 01.06.2024 22:20

@Yksisarvinen - хороший улов, старею с возрастом :)

David C. Rankin 02.06.2024 00:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
95
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Эта программа должна выдавать ошибки во время компиляции, потому что std::remove [cppreference] принимает const char*, а вы передаете std::string. Вместо этого вам следует передать указатель на const char[N], который содержит std::string. То же самое с std::rename. [cppreference]

Для компиляции этот код должен быть:

std::remove(file_name.c_str());
std::rename("temp.txt", file_name.c_str());

С другой стороны, поведение программы во время выполнения зависит от настроек вашей среды, требований, определенных реализацией, и различных других мелочей. ОС Windows не позволяет удалять или переименовывать файлы, используемые какой-либо программой.

Другие вопросы по теме