Я не уверен, почему, если я сохраню имя файла в переменной «имя_файла», оно не удалит и не переименует его. Он не позволяет мне его запустить, есть ли в этом причина?
#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);
}
}
}
Ничто в этом коде не нуждается в дополнительных вещах, которые делает std::endl. Используйте '\n', чтобы завершить строку, если нет веской причины не делать этого. В частности, запись std::endl в файл снижает производительность.
Примечание: выработайте привычку инициализировать объекты значимыми значениями, а не инициализировать их по умолчанию и немедленно перезаписывать значения по умолчанию. В данном случае это означает замену fstream writedata; fstream readdata; writedata.open(file_name); readdata.open("temp.txt"); на fstream writedata(file_name); readdata("temp.txt");.
Кроме того, файл, в который вы только пишете, должен быть std::ofstream, а файл, из которого вы только читаете, должен быть std::ifstream.
Логика цикла выглядит неправильно; когда ввод соответствует book, он закрывает файлы, удаляя все, что еще не было прочитано.
И пока я придираюсь к вам: не должен ли writedata быть выходной файл, а readdata входной файл? Очень сложно читать из файла с именем write... и записывать в файл с именем read....
Вы забыли std::ios::out для выходного файла? См. std::basic_fstream::open. Вам следует использовать ifstream и ofstream.
@DavidC.Rankin Как указано в предоставленной вами ссылке, std::ios::out является значением по умолчанию для std::fstream, так же, как std::ios::in.
@Yksisarvinen - хороший улов, старею с возрастом :)





Эта программа должна выдавать ошибки во время компиляции, потому что 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 не позволяет удалять или переименовывать файлы, используемые какой-либо программой.
Виноват! Я забыл его добавить, так как это часть более крупной программы.