C ++ | Вернуться к этому снова с этими файлами

Вот и я, ребята, снова потерян в сложности работы с файлами. Итак, вот моя программа:

{старый для не-плаксивого}

#include <iostream>
#include <string>
#include <cstdlib>
#include <windows.h>
#include <stdexcept>
#include <limits>
#include <Lmcons.h>
#include <fstream>
#include <stdio.h>
using namespace std;void out(string x){x+="\n";cout<<x;}
void outn(){out("");}
void delay(int x){Sleep(x);}
void delayS(int x){Sleep(x*1000);}
void cs(){std::system("cls");}
void UserName(string *x){char username[UNLEN + 1];
DWORD size = UNLEN + 1;
GetUserName(username, &size);
string transition(username);*x=transition;}
//use this syntax in main : string username;UserName(&username);//main in case you ain't noticed
int main()
{
//getting username
string username;
UserName(&username);
/*out(username);*///init
const string namefile="preferences.txt";
string path;
const string beginning="C:\\Users\\";
const string ending="\\AppData\\Roaming\\Processing\\";

//path init
path+=beginning;
path+=username;
path+=ending;

string path2;
path2=path;
path2+="new.txt";
string filename2="new.txt";

path+=namefile;//new lines init
string line76="proxy.http.host=proxy-eple.in.ac-nantes.fr";
string line77="3128";
string line78="proxy.https.host=proxy-eple.in.ac-nantes.fr";
string line79="3128";
string line80="proxy.socks.host=proxy-eple.in.ac-nantes.fr";
string line81="3128";//files init
fstream file;
//fstream newfile;
ofstream newfile(path2.c_str());//main try-catch process
try{
file.open(path.c_str() ,ios::in);
if(!file.is_open()){throw 404;}
//procédure de modif
else{
file.close();

//file manipulation
file.open(path.c_str());
try{newfile.open(path2.c_str(),ios::out|ios::trunc);
if(!newfile.is_open()){throw 404;}}
catch(int x){cout<<"Error "<<x<<" : failed to open file \\new.txt\\";}

for (unsigned int i = 1; i < 76; i++)
{
std::string text;
getline(file, text);
newfile << text <<endl;
}
newfile << line76 <<endl;
newfile << line77 <<endl;
newfile << line78 <<endl;
newfile << line79 <<endl;
newfile << line80 <<endl;
newfile << line81 <<endl;
for (unsigned int i = 82; i < 97; i++)
{
std::string text;
std::getline(file, text);
newfile << text <<endl;
}
newfile << "";
}//end of file manipulation
file.close();newfile.close();
string old1 = beginning+username+ending+"old_pref.txt";//renaming process

//rename preferences.txt to old_pref.txt
try{int rf=rename(path.c_str(),old1.c_str());
if(rf!=0){throw 911;}}
//1st catch in case you ain't noticed
catch(int x){cout<<"Error "<<x<<" : Failed to rename to \\old_pref.txt\\";}
//end of 1st catch

//rename new.txt to preferences.txt
try{int rf2=rename(path2.c_str(),path.c_str());
if(rf2!=0){throw 911;}}

//2nd catch in case you ain't noticed
catch(int x){
cout<<"Error "<<x<<" : Failed to rename to \\preferences.txt\\";}
//end of 2nd catch

//ending process
cs();out("done !");}//end of main try

//main catch
catch(int x){
cout<<"Error "<<x<<" : failed to open file \\preferences.txt\\";}
//end of main catch

return 0;
} //end of main

{/ старый без нытья}

{для плаксивых (PS: да, я не забочусь о библиотеках, как вы не заботитесь об уважении) (например, давай: нечитаемый, не разбираемый как … получить очки и расслабиться)}

#include <iostream>
#include <string>
#include <cstdlib>
#include <windows.h>
#include <stdexcept>
#include <limits>
#include <Lmcons.h>
#include <fstream>
#include <stdio.h>using namespace std;void out(string x)
{
x+="\n";
cout<<x;
}
void outn()
{
out("");
}
void delay(int x)
{
Sleep(x);
}
void delayS(int x)
{
Sleep(x*1000);
}
void cs()
{
std::system("cls");
}
void UserName(string *x)
{
char username[UNLEN + 1];
DWORD size = UNLEN + 1;
GetUserName(username, &size);
string transition(username);
*x=transition;
}
//use this syntax in main : string username;UserName(&username);int main()
{string username;
UserName(&username);
/*out(username);*/const string namefile="preferences.txt";string path;

const string beginning="C:\\Users\\";
const string ending="\\AppData\\Roaming\\Processing\\";

path+=beginning;
path+=username;
path+=ending;

string path2;
path2=path;
path2+="new.txt";
string filename2="new.txt";

path+=namefile;string line76="proxy.http.host=proxy-eple.in.ac-nantes.fr";
string line77="3128";
string line78="proxy.https.host=proxy-eple.in.ac-nantes.fr";
string line79="3128";
string line80="proxy.socks.host=proxy-eple.in.ac-nantes.fr";
string line81="3128";fstream file;
//fstream newfile;
ofstream newfile(path2.c_str());

try
{
file.open(path.c_str(),ios::in);
if(!file.is_open())
{
throw 404;
}
//procédure de modif
else
{
file.close();

file.open(path.c_str());
try
{
newfile.open(path2.c_str(),ios::out|ios::trunc);
if(!newfile.is_open())
{
throw 404;
}
}
catch(int x)
{
cout<<"Error "<<x<<" : failed to open file \\new.txt\\";
}

for (unsigned int i = 1; i < 76; i++)
{
std::string text;
getline(file, text);
newfile << text <<endl;
}
newfile << line76 <<endl;
newfile << line77 <<endl;
newfile << line78 <<endl;
newfile << line79 <<endl;
newfile << line80 <<endl;
newfile << line81 <<endl;
for (unsigned int i = 82; i < 97; i++)
{
std::string text;
std::getline(file, text);
newfile << text <<endl;
}
newfile << "";

}

file.close();
newfile.close();
string old1 = beginning+username+ending+"old_pref.txt";

try
{
int rf=rename(path.c_str(),old1.c_str());
if(rf!=0)
{
throw 911;
}
}
catch(int x)
{
cout<<"Error "<<x<<" : Failed to rename to \\old_pref.txt\\";
}
try
{
int rf2=rename(path2.c_str(),path.c_str());
if(rf2!=0)
{
throw 911;
}
}
catch(int x)
{
cout<<"Error "<<x<<" : Failed to rename to \\preferences.txt\\";
}cs();
out("done !");
}
catch(int x)
{
cout<<"Error "<<x<<" : failed to open file \\preferences.txt\\";
}return 0;
}

{/ для нытья (PS: вы думаете, я все еще забочусь о отступах?)}

Хорошо, вот моя проблема:
Он открывает файл, создает new.txt и открывает его, он не заполняет new.txt, а затем обрабатывает процесс переименования.

Почему он не пишет в новый файл? Как я должен правильно сделать это заново, чтобы записать новый файл?

РЕДАКТИРОВАТЬ: я использую кодовые блоки 16.01

-1

Решение

ofstream newfile(path2.c_str());

Новый файл создается здесь. А потом, позже:

newfile.open(path2.c_str(),ios::out|ios::trunc);

Здесь делается попытка создать тот же файл во второй раз. Файл уже создан и открыт. Попытка открыть то же самое std::ofstream объект, который уже открыт, является ошибкой, а std::ofstream объект сейчас находится в состоянии ошибки.

Если объект находится в состоянии ошибки, все последующие попытки записи в объект потока будут неудачными.

Решение: создать файл один раз, а не дважды.

1

Другие решения

Вот исправленный код для тех, кому было бы интересно:

#include <iostream>
#include <string>
#include <cstdlib>
#include <windows.h>
#include <stdexcept>
#include <limits>
#include <Lmcons.h>
#include <fstream>
#include <stdio.h>

using namespace std;void out(string x)
{
x+="\n";
cout<<x;
}
void outn()
{
out("");
}
void delay(int x)
{
Sleep(x);
}
void delayS(int x)
{
Sleep(x*1000);
}
void cs()
{
std::system("cls");
}
void UserName(string *x)
{
char username[UNLEN + 1];
DWORD size = UNLEN + 1;
GetUserName(username, &size);
string transition(username);
*x=transition;
}
//use this syntax in main : string username;UserName(&username);int main()
{string username;
UserName(&username);
/*out(username);*/const string namefile="preferences.txt";string path;

const string beginning="C:\\Users\\";
const string ending="\\AppData\\Roaming\\Processing\\";

path+=beginning;
path+=username;
path+=ending;

string path2;
path2=path;
path2+="new.txt";
string filename2="new.txt";

path+=namefile;string line76="proxy.http.host=proxy-eple.in.ac-nantes.fr";
string line77="proxy.http.port=3128";
string line78="proxy.https.host=proxy-eple.in.ac-nantes.fr";
string line79="proxy.https.port=3128";
string line80="proxy.socks.host=proxy-eple.in.ac-nantes.fr";
string line81="proxy.socks.port=3128";fstream file;
//fstream newfile;
ofstream newfile/*(path2.c_str())*/;

try
{
file.open(path.c_str(),ios::in);
if(!file.is_open())
{
throw 404;
}
//procédure de modif
else
{
file.close();

file.open(path.c_str());
try
{
newfile.open(path2.c_str(),ios::out|ios::trunc);
if(!newfile.is_open())
{
throw 404;
}
}
catch(int x)
{
cout<<"Error "<<x<<" : failed to open file \\new.txt\\";
}

for (unsigned int i = 1; i < 76; i++)
{
std::string text;
getline(file, text);
newfile << text <<endl;
}
newfile << line76 <<endl;
newfile << line77 <<endl;
newfile << line78 <<endl;
newfile << line79 <<endl;
newfile << line80 <<endl;
newfile << line81 <<endl;

//because we still need it to roll through the file before copying
for(unsigned int i=76; i<82; i++)
{
std::string text;
std::getline(file,text);
}

for (unsigned int i = 82; i < 97; i++)
{
std::string text;
std::getline(file, text);
newfile << text <<endl;
}
newfile << "";

}

file.close();
newfile.close();
string old1 = beginning+username+ending+"old_pref.txt";

try
{
int rf=rename(path.c_str(),old1.c_str());
if(rf!=0)
{
throw 911;
}
}
catch(int x)
{
cout<<"Error "<<x<<" : Failed to rename to \\old_pref.txt\\";
}
try
{
int rf2=rename(path2.c_str(),path.c_str());
if(rf2!=0)
{
throw 911;
}
}
catch(int x)
{
cout<<"Error "<<x<<" : Failed to rename to \\preferences.txt\\";
}cs();
out("done !");
}
catch(int x)
{
cout<<"Error "<<x<<" : failed to open file \\preferences.txt\\";
}return 0;
}
0

По вопросам рекламы [email protected]