Ayuda guardado de archivo

Iniciado por novatus84, 27 Noviembre 2014, 13:25 PM

0 Miembros y 4 Visitantes están viendo este tema.

novatus84

No consigo que me cree el data2.txt.

Código (cpp) [Seleccionar]
#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);
}

Orubatosu

Prueba

ofstream ofile ("data2.txt", ofstream::out);

A ver que pasa
"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998

novatus84

Gracias pero me sigue sin crear "data2.txt"

engel lex

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

ivancea96

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.

Orubatosu

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

"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998

eferion

#6
solo un pequeño detalle tonto. No tiene nada que ver con la incidencia, pero aun así:

Esto:

Código (cpp) [Seleccionar]

   vector<string> text = load_vector(filename);
   sort(text.begin(), text.end());
   text.erase(unique(text.begin(), text.end()), text.end());


es equivalente a:

Código (cpp) [Seleccionar]
set<string> text = load_vector(filename);

O, si no quieres que load_vector devuelva un set:

Código (cpp) [Seleccionar]

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:

Código (cpp) [Seleccionar]

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:

Código (cpp) [Seleccionar]

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).

novatus84

#7
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....

ivancea96

Puedes poner tolower(text[ i ]) directamente, sin locale.

novatus84

Si le quito el loc, me dice:  "no matching function for call to 'tolower'?