PDA

Visualizza la versione completa : [C++] Leggere ultima riga di un file


lorty
26-10-2009, 16:24
Salve, come da titolo, è possibile leggere da un file solo l ultima riga?
come devo fare?

ifstream f("temp.txt");
string s;
int k;

getline(f, s);
k=atoi(s.c_str()+27);

è possibile spostare il puntatore fino all ultima riga?
mi interessa il 27esimo carattere dell'ultima riga di un file.
Il file non ha una dimensione fissa perchè ogni volta che viene richiamata la funzione, crea un altro file di dimensione diversa ma di cui mi interessa comunuqe solo il 27esimo carattere dell ultima riga.

Grazie.

sebaldar
26-10-2009, 17:04
Originariamente inviato da lorty


è possibile spostare il puntatore fino all ultima riga?
Grazie.

è possibile farlo, posizioni il cursore alla fine del file con seek e vai indietro del numero di caratteri che desideri, o fino a che non trovi il carattere di nuova riga
ciao
sergio

lorty
26-10-2009, 17:17
come faccio ad andare indietro?
hai per caso un Howto per usare seek che non riesco a trovare granchè su internet?
grazie.

sebaldar
26-10-2009, 17:23
usa la funzione membro di ifstream
http://www.cplusplus.com/reference/iostream/istream/seekg/

sebaldar
26-10-2009, 17:34
studiati anche la funzione membro getline, ricordati che con fstream crei una istanza di un oggetto, non ottiene direttamente un file pointer.
http://www.cplusplus.com/reference/iostream/istream/getline/

ciao
sergio

lorty
26-10-2009, 18:44
Ciao, ho provato a fare una cosa del genere:

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <stdio.h>
#include <cstring>
#include <string>
#include <sstream>

using namespace std;

int main ()
{
char s;
FILE * pFile;
pFile = fopen ( "example.txt" , "w" );
fputs ( "@@@@@@@@@@@@@@@@@" , pFile );
fseek ( pFile , 1 , SEEK_SET );
fscanf (pFile, "%c", &s);
cout << "ciao"<<s <<endl;
fclose ( pFile );
return 0;
}

ma stampa solo:
ciao
come se in s non ci fosse nulla. Forse uso male la scanf? con getline invece di scanf dava questo errore:

prova.cpp: In function ‘int main()’:
prova.cpp:18: error: no matching function for call to ‘getline(FILE*&, char&)’
/usr/include/stdio.h:649: note: candidates are: __ssize_t getline(char**, size_t*, FILE*)

perchè faccio FILE * pFile invece di ifstream pFile("example").

sebaldar
26-10-2009, 19:07
se vuoi puoi usare un file pointer che apri con fopen (lo devi però fare in modalità anche read) se però vuoi imparere il C++ è meglio se usa fstream.
Riguardati e studiati il link che ti ho postato
ciao
sergio

lorty
26-10-2009, 19:16
Ma secondo te perchè non inserisce niente in s?

lorty
26-10-2009, 19:24
ok ho risolto, invece di "w" ci vuole "r"

lorty
26-10-2009, 19:44
Scusa un ultima domanda:

come posso inserire degli interi nel nome del file al posto di fn.str() e gn.str() ?

se faccio:

stringstream fn;
stringstream gn;

n=0;
p=1;
fn.str("");
gn.str("");

fn << n;
gn << p;

file= "trans_nodi"+fn.str()+"run"+gn.str()+".txt";

mi dice:

lettura_dati.cpp:19: error: aggregate ‘std::stringstream fn’ has incomplete type and cannot be defined
lettura_dati.cpp:20: error: aggregate ‘std::stringstream gn’ has incomplete type and cannot be defined

dove sbaglio?

Loading