|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Apr 2005
Città: <-|-|-*|*-|-|->
Messaggi: 347
|
[C/C++] Ridirezionamento output su file
Ciao a tutti,
non ricordo più come fare per ripristinare lo standard output su monitor, anzichè su file, al termine del ciclo.. Cosa sto dimenticando? Sicuramente ho tralasciato qualche dup/dup2 per ripristinare il flusso, ma sono fuso ora e non capisco dove.. grazie! Codice:
using namespace std; #include <iostream> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> int main(int argc, char *argv[]){ for(int i=0;i<10;i++){ int fd; fd=open(argv[1],O_WRONLY|O_APPEND|O_CREAT); dup2(fd,1); cout << "mia zia è sexy!" << endl; chmod(argv[1],S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); close(fd); } cout << "Questo non lo displaya" << endl; return 0; } |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Devi prima salvare l'fd originale:
int old_fd = dup(fileno(stout)); e infine ripristinarlo: dup2(old_fd, fileno(stdout)); dopo aver evvettuato i flush del caso. NB la tua è una pessima tecnica, in quanto il c++ supporta tranquillamente gli stream su file.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2005
Città: <-|-|-*|*-|-|->
Messaggi: 347
|
Ok, hai ragione! Non avevo ricevuto la notifica della tua risposta quindi ho creato una nuova discussone credendo nessuno avesse risposto.
Cmq ora ho sistemato e funziona la ridirezione. Cosa intendi per flush? PS: io sono il tizio del Santech che doveva verificare quali sono i driver che non vanno bene, appena torno a casa (nei prossimi giorni) proverò a fare come dici tu.. scusa il ritardo! Thanks |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
In soldoni: usa gli strumenti di streamed I/O del c++ se devi scrivere su un file.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 Ultima modifica di ilsensine : 07-11-2005 alle 13:20. |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
nb c'è inoltre un bug serio; se la open viene invocata con O_CREAT, occorre passare un terzo parametro (il "modo" di creazione, ad es. 0640). Nel tuo caso, se il file non esiste e viene creato, gli attributi saranno assolutamente casuali.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2005
Città: <-|-|-*|*-|-|->
Messaggi: 347
|
E' vero.. infatti non capivo perchè poi non mi lasciava copiare la cartella in cui è scritto il codice. Ora ho modificato aggiungendo 0640 e funzica meglio.
Grazie.. vedrò inoltre di usare le librerie del c++ |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
http://www.cplusplus.com/ref/iostrea...ream/open.html
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
E questo infine è un esempio pratico del perché il tuo metodo è sbagliato.
Prova a eseguire questo programma, e vedrai che la scritta "ciao" finisce nel file prova.txt! Codice:
#include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <iostream> int main(void) { std::cout << "ciao"; dup2(open("prova.txt", O_WRONLY|O_CREAT|O_APPEND, 0640), fileno(stdout)); return 0; }
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Apr 2005
Città: <-|-|-*|*-|-|->
Messaggi: 347
|
Cosi facendo però mi da un errore di compilazione...
Codice:
ofstream outfile; outfile.open (argv[1], ofstream::out | ofstream::app); outfile << "prova"; outfile << spectras[i]->display_results() << endl; outfile.close(); Cosa ne dici? Il problema è che non riconosce il metodo della classe come stdout secondo me.. Codice:
make g++ -c main.cpp main.cpp: In function `int main(int, char**)': main.cpp:76: error: no match for 'operator<<' in 'outfile << spectras[i]->MsmSpectra::display_results()' /usr/include/g++/bits/ostream.tcc:63: error: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>&(*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/g++/bits/ostream.tcc:74: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>&(*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/g++/bits/ostream.tcc:86: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base&(*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/g++/bits/ostream.tcc:122: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/g++/bits/ostream.tcc:156: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/g++/bits/ostream.tcc:98: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/g++/ostream:178: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/g++/ostream:189: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/g++/ostream:193: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/g++/ostream:204: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/g++/bits/ostream.tcc:181: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/g++/bits/ostream.tcc:216: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/g++/bits/ostream.tcc:241: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/g++/ostream:219: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/g++/bits/ostream.tcc:265: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/g++/bits/ostream.tcc:289: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(const void*) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/g++/bits/ostream.tcc:313: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/g++/ostream:436: error: std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, char) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/g++/bits/ostream.tcc:512: error: std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, char) [with _Traits = std::char_traits<char>] /usr/include/g++/ostream:447: error: std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, signed char) [with _Traits = std::char_traits<char>] /usr/include/g++/ostream:452: error: std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, unsigned char) [with _Traits = std::char_traits<char>] /usr/include/g++/bits/ostream.tcc:572: error: std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const char*) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/g++/bits/ostream.tcc:616: error: std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const char*) [with _Traits = std::char_traits<char>] /usr/include/g++/ostream:486: error: std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const signed char*) [with _Traits = std::char_traits<char>] /usr/include/g++/ostream:491: error: std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const unsigned char*) [with _Traits = std::char_traits<char>] /usr/include/g++/iomanip:82: error: std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, std::_Resetiosflags) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/g++/iomanip:116: error: std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, std::_Setiosflags) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/g++/iomanip:154: error: std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, std::_Setbase) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/g++/iomanip:227: error: std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, std::_Setprecision) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/g++/iomanip:261: error: std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, std::_Setw) [with _CharT = char, _Traits = std::char_traits<char>] make: *** [main.o] Error 1 Ho poi provato così: Codice:
ofstream outfile; outfile.open (argv[1], ofstream::out | ofstream::app); outfile.operator<< (spectras[i]->display_results()); outfile.close(); Ultima modifica di shang84 : 14-11-2005 alle 11:38. |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
![]() Puoi passare un reference dell'ostream outfile al metodo display_results, e usarlo al posto di cout, oppure far sì che display_results ritorni una stringa o simile oggetto per il quale l'operatore << può capirci qualcosa ![]() Ad esempio la prima strada puoi seguirla così: Codice:
class myclass { void display_results(ostream &os=cout); }; ... void myclass::display_results(ostream &os) { os << "scrivo qualcosa" << endl; } int main(void) { ofstream ofile; myobject = myclass::create(); ofile.open("ciao.txt", ofstream::out | ofstream::app); myobject->display_results(ofile); // scrive su ofile ofile.close(); ... myobject->display_results(); // scrive su cout! }
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Apr 2005
Città: <-|-|-*|*-|-|->
Messaggi: 347
|
Quote:
![]() ![]() Cmq ora funziona tutto, ho fatto come dicevi tu passando al metodo direttamente lo stream. E' una figata così, molto efficacie da gestire.. grazie per la dritta ![]() |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:53.