PDA

View Full Version : [C++]Problema con ifstream e getline()


Pingu1084
31-05-2010, 18:47
Sto cercando di copiare il contenuto del file "asd1.txt" (contente 3 righe di testo) nel file "asd2.txt" (vuoto). Entrambi sono nella stessa cartella del file contenente il codice del programma, ma niente sembra funzionare. Il codice è il seguente:
#include <fstream>
#include <string>

using namespace std;

int main() {
ifstream in("asd1.txt");
ofstream out("asd2.txt");
string s;

while(getline(in, s)) {
out << s << "\n";
}

return 0;
}

fero86
01-06-2010, 00:34
Sto cercando di copiare il contenuto del file "asd1.txt" (contente 3 righe di testo) nel file "asd2.txt" (vuoto). Entrambi sono nella stessa cartella del file contenente il codice del programma, ma niente sembra funzionare. Il codice è il seguente:
#include <fstream>
#include <string>

using namespace std;

int main() {
ifstream in("asd1.txt");
ofstream out("asd2.txt");
string s;

while(getline(in, s)) {
out << s << "\n";
}

return 0;
}

a parte il fatto che sarebbe bene controllare col metodo good() che i due stream siano in buone condizioni, ma perché usi la getline come condizione del while? getline non restituisce un booleano, restituisce il primo parametro. per testare la fine dello stream di input usa il metodo istream::eof(), che restituisce un booleano.

inoltre c'é un errore concettuale: la versione di getline che tu usi estrae caratteri fino al terminatore di linea oppure fino alla fine dello stream, qualunque venga incontrata prima; nel caso della fine dello stream tu scrivi comunque un terminatore di linea, quindi se il file asd1.txt non si conclude con un terminatore di linea il file asd2.txt sará diverso perché invece si concluderá con un terminatore di linea.

per copiare brutalmente un file in un altro non vedo il bisogno di usare il formatted I/O: io userei i metodi di I/O binario, cioé istream::read e ostream::write.

shinya
01-06-2010, 10:39
Puoi usare anche una combinazione di std::copy, std::istream_iterator e std::ostream_iterator se vuoi una soluzione più compatta.

TRF83
01-06-2010, 11:24
Quoto fero86..se devi copiare brutalmente un file in un altro (senza specifiche..nel senso, se non è un esercizio di scuola con queste esplicite richieste!), andrei di read/write senza preoccuparmi troppo della lettura e della scrittura formattata..

Pingu1084
01-06-2010, 12:14
Io stavo usando quel codice perchè è ciò che ho trovato scritto nel libro che sto leggendo.
Potreste spiegarmi meglio in cosa consistono i metodi good(), istream::eof(), istream::read() e istream::write()?

DanieleC88
01-06-2010, 12:21
Potreste spiegarmi meglio in cosa consistono i metodi good(), istream::eof(), istream::read() e istream::write()?
http://www.cplusplus.com/reference/iostream/

Pingu1084
01-06-2010, 18:34
Siccome ho iniziato da poco il C++ non ho capito più di tanto dalla pagina linkata.
Qualcuno potrebbe farmi un esempio dell'utilizzo di quelle funzioni e spiegarmi bene come si usano?

DanieleC88
01-06-2010, 18:41
Sono abbastanza autoesplicative: "good()" ti dice se lo stream aperto è in una condizione accettabile per la lettura/scrittura dello stesso, "eof()" indica che lo stream di input è terminato, "read()" legge una sequenza di byte dallo stream e "write()" ve la scrive.

Pingu1084
02-06-2010, 06:35
Sono abbastanza autoesplicative: "good()" ti dice se lo stream aperto è in una condizione accettabile per la lettura/scrittura dello stesso, "eof()" indica che lo stream di input è terminato, "read()" legge una sequenza di byte dallo stream e "write()" ve la scrive.

Questo l'avevo capito, quello che non avevo capito sono i parametri da inserire in read() e quelli da inserire in write()