Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: novatus84 en 27 Noviembre 2014, 13:25 pm



Título: Ayuda guardado de archivo
Publicado por: novatus84 en 27 Noviembre 2014, 13:25 pm
No consigo que me cree el data2.txt.

Código
  1. #include<string>    // std::string
  2. #include<vector>    // std::vector<>
  3. #include<iostream>  // std::cout | std::cin | std::cerr
  4. #include<fstream>   // std::ifstream | std::ofstream
  5. #include<cstdlib>   // std::exit()
  6. #include<algorithm>  // std:: sort()
  7. #include <locale>
  8. #include <cctype>
  9. using namespace std;
  10.  
  11. vector<string> load_vector(const string&);
  12. void save_vector(const vector<string>&, const string&);
  13. void error(const string&);
  14.  
  15. int main() {
  16.    string filename2 = "data2.txt";
  17.    //locale loc;
  18.    string filename = "data.txt";
  19.    vector<string> text = load_vector(filename);
  20.  
  21.    sort(text.begin(), text.end());
  22.    text.erase(unique(text.begin(), text.end()), text.end());
  23.  
  24.    //for (unsigned int i=0; i<text.size(); i++) {
  25.      // text [i] = tolower (text[i], loc);
  26.   // }
  27.  
  28.    save_vector(text, filename2);
  29.    return 0;
  30.  
  31.  
  32.  
  33. }
  34.  
  35. vector<string> load_vector(const string& filename) {
  36.    vector<string> vi;
  37.  
  38.    ifstream ifile {filename};  
  39.  
  40.    if (!ifile)
  41.        error("load_vector cannot open the file " + filename);
  42.    copy(istream_iterator<string>(ifile), istream_iterator<string>(), back_inserter(vi));
  43.  
  44.    return vi;
  45. }
  46.  
  47.  
  48.  
  49. void save_vector(const vector<string>& vi, const string& filename2) {
  50.  
  51.    ofstream ofile ("data2.txt");  
  52.  
  53.    if (!ofile)
  54.        error("save_vector cannot open the file " + filename2);
  55.    for (auto n : vi)
  56.        ofile << n << ' ';
  57.    ofile.close();
  58.    cout << "\nVector written in file \"" << filename2 << "\"" << endl;
  59. }
  60. void error(const string& s) {
  61.    cerr << "Error: " << s << endl;
  62.    exit(EXIT_FAILURE);
  63. }
  64.  


Título: Re: Ayuda guardado de archivo
Publicado por: Orubatosu en 27 Noviembre 2014, 13:52 pm
Prueba

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

A ver que pasa


Título: Re: Ayuda guardado de archivo
Publicado por: novatus84 en 27 Noviembre 2014, 13:55 pm
Gracias pero me sigue sin crear "data2.txt"


Título: Re: Ayuda guardado de archivo
Publicado por: engel lex en 27 Noviembre 2014, 14:44 pm
No da error ni nada?


Título: Re: Ayuda guardado de archivo
Publicado por: ivancea96 en 27 Noviembre 2014, 14:46 pm
A mi me lo crea perfectamente, compilando con -std=c++11.

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

Ofstream viene con ios::out por defecto.


Título: Re: Ayuda guardado de archivo
Publicado por: Orubatosu en 27 Noviembre 2014, 14:52 pm
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



Título: Re: Ayuda guardado de archivo
Publicado por: eferion en 27 Noviembre 2014, 15:10 pm
solo un pequeño detalle tonto. No tiene nada que ver con la incidencia, pero aun así:

Esto:

Código
  1.    vector<string> text = load_vector(filename);
  2.    sort(text.begin(), text.end());
  3.    text.erase(unique(text.begin(), text.end()), text.end());

es equivalente a:

Código
  1. set<string> text = load_vector(filename);

O, si no quieres que load_vector devuelva un set:

Código
  1. vector<string> temp = load_vector(filename);
  2. 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
  1. for ( auto it = text.begin( ); it != text.end( ); ++it )
  2.  std::cout << *it << std::endl;

O si te gustan más, también lo puedes hacer con lambdas:

Código
  1. std::for_each( text.begin( ), text.end( ),
  2.               []( const std::string& str )
  3.               { 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).


Título: Re: Ayuda guardado de archivo
Publicado por: novatus84 en 27 Noviembre 2014, 15:48 pm
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....


Título: Re: Ayuda guardado de archivo
Publicado por: ivancea96 en 27 Noviembre 2014, 17:36 pm
Puedes poner tolower(text[ i ]) directamente, sin locale.


Título: Re: Ayuda guardado de archivo
Publicado por: novatus84 en 27 Noviembre 2014, 17:41 pm
Si le quito el loc, me dice:  "no matching function for call to 'tolower'?


Título: Re: Ayuda guardado de archivo
Publicado por: zShackra en 27 Noviembre 2014, 18:08 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.


Título: Re: Ayuda guardado de archivo
Publicado por: novatus84 en 27 Noviembre 2014, 18:22 pm
Como puede funcionar con string que es mi vector?