|
|||||||
|
|
|
![]() |
|
|
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 14: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 12: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: 22:13.



















