Ayuda tolower & overwrite c++

Iniciado por novatus84, 2 Diciembre 2014, 19:17 PM

0 Miembros y 1 Visitante están viendo este tema.

novatus84

Buenas tengo casi terminado el programa aunque me falta rematarlo. Necesito que el usuario decida por teclado si quiere sobrescribir el data2.txt que ya existe creado o no , esta parte la tengo casi casi. Por otra parte no consigo hacer funcionar la función tolower en un vector string ahi tengo varias pruebas que no consigo que funcionen muchas gracias de antemano.
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>  // std::tolower | st::locale
#include <cctype>   //tolower

using namespace std;

vector<string> load_vector(const string&);
void save_vector(const vector<string>&, const string&);
void error(const string&);

int main() {
   
   string filename = "data.txt";
   vector<string> text = load_vector(filename);
   
   string filename2 = "data2.txt";
   
   fstream file;    // start to see if we want to overwrite the file if the file already exist
   file.open("data2.txt", ios_base::out | ios_base::in);  // will not create file
   if (file.is_open())
   {
       cout << "Warning, file already exists, proceed?";
       if (!file.is_open())
       {
           file.close();
           
       }
   }
   else
   {
       file.clear();
       file.open("data2.txt", ios_base::out);  // will create if necessary
   }
   
   
   
   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 ();
   }
   
  // for (auto word : text) {
    //   string lowcase;
      // for (auto ch : word)
        //   if (ch>='A' and ch<='Z') lowcase += ch +'a'-'A' ; else lowcase = ch;
      // word = lowcase;
 } */
 
   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", ofstream::out);
   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;
}
/* return true if two vector<string> contain exactly the same members
bool compare(const vector<string>& v1, const vector<string>& v2) {
   if (v1.size()!=v2.size())
       return false;       // vectors have different sizes
   
   for (int i=0; i<v1.size(); ++i)
       if (v1[i]!=v2[i])
           return false;   // i-th members of v1 and v2 are different
   
   return true;
}
*/
void error(const string& s) {
   cerr << "Error: " << s << endl;
   exit(EXIT_FAILURE);
}

avesudra

Lo de la función tolower lo puedes solucionar con la función transform de la biblioteca <algorithm> , que te permite hacer una operación específica sobre cada elemento que recorre un iterador.

Código (cpp) [Seleccionar]

std::string str = "mi cadena";
std::transform(str.begin(), str.end(), str.begin(), std::tolower);


Un saludo.
Regístrate en