No consigo que me cree el data2.txt.
#include<string> // std::string
#include<vector> // std::vector<>
#include<iostream> // std::cout | std::cin | std::cerr
#include<fstream> // std::ifstream | std::ofstream
#include<cstdlib> // std::exit()
#include<algorithm> // std:: sort()
#include <locale>
#include <cctype>
using namespace std;
vector<string> load_vector(const string&);
void save_vector(const vector<string>&, const string&);
void error(const string&);
int main() {
string filename2 = "data2.txt";
//locale loc;
string filename = "data.txt";
vector<string> text = load_vector(filename);
sort(text.begin(), text.end());
text.erase(unique(text.begin(), text.end()), text.end());
//for (unsigned int i=0; i<text.size(); i++) {
// text [i] = tolower (text[i], loc);
// }
save_vector(text, filename2);
return 0;
}
vector<string> load_vector(const string& filename) {
vector<string> vi;
ifstream ifile {filename};
if (!ifile)
error("load_vector cannot open the file " + filename);
copy(istream_iterator<string>(ifile), istream_iterator<string>(), back_inserter(vi));
return vi;
}
void save_vector(const vector<string>& vi, const string& filename2) {
ofstream ofile ("data2.txt");
if (!ofile)
error("save_vector cannot open the file " + filename2);
for (auto n : vi)
ofile << n << ' ';
ofile.close();
cout << "\nVector written in file \"" << filename2 << "\"" << endl;
}
void error(const string& s) {
cerr << "Error: " << s << endl;
exit(EXIT_FAILURE);
}
Prueba
ofstream ofile ("data2.txt", ofstream::out);
A ver que pasa
Gracias pero me sigue sin crear "data2.txt"
No da error ni nada?
A mi me lo crea perfectamente, compilando con -std=c++11.
Cita de: Orubatosu en 27 Noviembre 2014, 13:52 PM
ofstream ofile ("data2.txt", ofstream::out);
Ofstream viene con
ios::out por defecto.
Una pregunta muy muy muy tonta...
Supongo que no tienes el fichero abierto, por ejemplo en Notepad o similar para hacer alguna comprobación anterior.
A veces cuestiones tremendamente "tontas" pasan
solo un pequeño detalle tonto. No tiene nada que ver con la incidencia, pero aun así:
Esto:
vector<string> text = load_vector(filename);
sort(text.begin(), text.end());
text.erase(unique(text.begin(), text.end()), text.end());
es equivalente a:
set<string> text = load_vector(filename);
O, si no quieres que load_vector devuelva un set:
vector<string> temp = load_vector(filename);
set<string> text( temp.begin( ), temp.end( ) );
Esto es así porque std::set es un contenedor que:
* Mantiene sus elementos debidamente ordenados
* No admite duplicados
Matas 2 problemas de un plumazo.
Eso sí, dos cosas a tener en cuenta:
* std::set no tiene push_back, no tendría sentido. En su lugar hay que usar "insert".
* std::set no incorpora el operador de indización "[]", para acceder a sus elementos se puede hacer uso de bucles tipo:
for ( auto it = text.begin( ); it != text.end( ); ++it )
std::cout << *it << std::endl;
O si te gustan más, también lo puedes hacer con lambdas:
std::for_each( text.begin( ), text.end( ),
[]( const std::string& str )
{ std::cout << str << std::endl; } );
Y hablando ahora de tu problema... deberías asegurarte de que el archivo lo estás creando donde piensas. Prueba a poner la ruta completa. Puede ser que te esté intentando crear el archivo en otro directorio (el de trabajo, que no tiene que coincidir con el directorio donde se encuentra el ejecutable).
Perfecto mil gracias, he metido la ruta y ya me funciona, mil gracias!!
Otra cosilla, quitando los comentarios del tolower no doy con la forma de que me funcione antes de guardar el archivo....
Puedes poner tolower(text[ i ]) directamente, sin locale.
Si le quito el loc, me dice: "no matching function for call to 'tolower'?
Cita de: novatus84 en 27 Noviembre 2014, 17:41 PM
Si le quito el loc, me dice: "no matching function for call to 'tolower'?
tolower() (http://www.cplusplus.com/reference/cctype/tolower/) pertenece a la librería estándar <cctype> (http://www.cplusplus.com/reference/cctype/), y espera un entero como único parámetro.
Como puede funcionar con string que es mi vector?