Newsgroup: it.comp.lang.c++
Titolo: vector<char* >che deve contenere le linee in un file

Salve ng!
Premetto che è la prima volta che utilizzo STL (ed è da poco più che ho
iniziato a programmare in c++:)
Ho bisogno di mettere in un vector le linee di un file.
Ma il codice
#include <fstream>
#include <vector>
using namespace std;
void main()
{
  vector<char*> testo;
  char* temp;
  ifstream f("C:\borland\bcc55\bin\messaggi.dat");
  while(!f.eof())
  {
   f.getline(temp, 500);
   testo.push_back(temp);
  }
}
(che si compila perfettamente), qundo lo eseguo dice che ho eseguito un'
operazione non valida.
è per caso char* che dà problemi?
Grazie in anticipo

 Ho bisogno di mettere in un vector le linee di un file.
Prova con un vector di string... Vedrai che funziona...
-- 
Luc.

 Prova con un vector di string... Vedrai che funziona...
Non posso usare getline con string...
...
  vector<string> testo;
  string temp;
...
   f.getline(temp, 500);  //<--errore, e non funziona nemmeno con
...                       //(char*)temp
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ...                       //(char*)temp
scusa sono uno stupido...
ma anche se uso
...
  vector<string> testo;
  char* temp;
...
   f.getline(temp, 500);
   testo.push_back((string)temp);
...
dà lo stesso errore di prima
(ma perché si può convertire da char* a string e non da string a char*)


    testo.push_back((string)temp);
Devi usare la funzione libera std::getline() e non la funzione membro di
fstream.
Ciao,
Nicola

 --
Eccoti un alternativa usando vettore di stringhe:
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
 vector<string> testo;
 string strLine;
 ifstream f("C:\\test.txt"); // metti un file a tua scelta
 if ( f.fail() )
 {
  cout << "The file does not exist" << endl;
  exit(1);
 }
 // qui si riempie il vettore con le linee del file
 while(!f.eof())
 {
  getline(f, strLine);
  testo.push_back(strLine);
 }
 // qui si usa un iteratore per stampare sul video le linee
 // contenute nel vettore
 vector<string>::iterator vIter;
 for (vIter = testo.begin(); vIter != testo.end(); vIter++)
  cout << *vIter << endl;
#ifdef WIN32
 system("PAUSE");
#endif
 return 0;
}
Maurus

grazie a tutti.

 (ma perché si può convertire da char* a string e non da string a char*)
Perché le conversioni a puntatore sono drammaticamente pericolose. Comunque,
il metodo c_str della classe string fa il lavoro:
std::string s="zello";
//const char* buf=s; //Compile error
const char* buf=s.c_str();
Ciao,
zello


Comunque nessuno ha colto il punto: temp è un char * NON inizializzato,
quindi non punta a nulla e non puoi scriverci dentro. Ecco perché ti dava
errore.

 using namespace std;
[cut]
scusa, una domanda stupida:
ho letto che fstream include iostream? E' vero?
perché li hai inclusi entrambi?
--
"Have you run your fingers down the wall
 And have you felt your neck skin crawl
 When you are searching for the light?"
        [Iron Maiden - Fear of the dark]


Ciao Arsenio,
in realta' se guardi i files iostream e fstream, loro includono entrambi
istream.
Per cui ho dovuto includere entrambi poiche' avevo bisogno di iostream per
poter usare std::cout e fstream per poter usare ifstream.
Prova a commentare una delle 2 inclusioni e vedrai se il tuo compilatore ti
da' degli errori.
Maurus

 iniziato a programmare in c++:)
Qua ti posto anche un'alternativa usando le stl e una piccola gestione delle
eccezioni.
Nel caso in cui il file che si vuole leggere e mettere in un vettore di
righe non esista, allora il metodo lancia una eccezione che viene "presa",
per essere stampata a video.
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class CMyException
{
public:
 CMyException () {m_pszReason = NULL;}
 ~CMyException () {if (m_pszReason) delete []m_pszReason;}
 void Set(char *szReason)
 {
  if (m_pszReason) delete []m_pszReason;
  int len = strlen(szReason);
  m_pszReason = new char[len+1];
  strcpy(m_pszReason, szReason);
 }
 char * What() {return m_pszReason;}
private:
 char *m_pszReason;
};
class CTextInFile
{
public:
 CTextInFile() {}
 ~CTextInFile() {}
 void Insert(char *szFileName);
 void Show();
private:
 vector<string> m_text;
 CMyException m_MyException;
};
void CTextInFile::Insert(char *szFileName)
{
 string strLine;
 ifstream f;
 f.open(szFileName);
 if ( f.fail() )
 {
  cout << "The file does not exist" << endl;
  m_MyException.Set("Not Existing File");
  throw m_MyException;
  return;
 }
 while(!f.eof())
 {
  getline(f, strLine);
  m_text.push_back(strLine);
 }
}
void CTextInFile::Show()
{
 // qui si usa un iteratore per stampare sul video le linee
 // contenute nel vettore
 vector<string>::iterator vIter;
 for (vIter = m_text.begin(); vIter != m_text.end(); vIter++)
  cout << *vIter << endl;
}
int main(int argc, char* argv[])
{
 CTextInFile tif;
 try
 {
  if (argc >= 2)
   tif.Insert(argv[1]);
  else
   tif.Insert("C:\\winzip.log"); // metti un file a tua scelta
  tif.Show();
 }
 catch(CMyException& e)
 {
  cout << e.What() << endl;


 perché li hai inclusi entrambi?
no, e` falso o, perlomeno, non sempre vero. Lo standard C++ non 
garantisce quali header debbano essere inclusi da altri header, quindi 
per evitare problemi devi sempre includere tutti quelli necessari.
ciao Anto
-- 
Antonio Cuni, 20 anni, studente
Brainbench C++ Master: 4.73, higher than 99% of all previous test takers.
C Language: 3.79, higher than 92% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 }
In questo modo, come asseri' giustamente Loreti tempo fa,c'é il
rischio di leggere una riga vuota in piů se é presente il fine riga in
fondo al file. E' meglio fare
while(std::getline(f,strline))
    {
    testo.push_back(strline);
    }
Il Ghenio
---------
// TODO: Place your ass here

(ma perché si può convertire da char* a string e non da string a char*)
La funzione membro di ofstream getline lavora ancora con i char*
anziche con le std::string, in quanto é stata concepita quando ancora
le std::string non erano state introdotte nello standard.
Quindi utilizza la funzione std::getline , fatta appositamente per le
std::string.
