Newsgroup: it.comp.lang.c
Titolo: Formattazione su stdout

Ciao a tutti,
premesso che lavoro sotto WinXP e uso gVim come editor e djgpp come 
compilatore, vi sottopongo il seguente problema. Sto ri-implementando il 
comando "cat.exe" (come indicato nel paragrafo 7.5 del KR). Il codice 
che ho scritto e' - praticamente - lo stesso che si puo' trovare nel libro:
#include <stdio.h>
#include <stdlib.h>
void filecopy(FILE*, FILE*);
int main(int argc, char* argv[])
{
	if (argc==1)
	{
		filecopy(stdin,stdout);
	}
	else
	{
		FILE* fp;
		while (--argc>0)
		{
			if ((fp=fopen(*++argv,"r"))==NULL)
			{
				printf(" -- could not open %s\n",*argv);
				return EXIT_FAILURE;
			}
			else
			{
				filecopy(fp,stdout);
				fclose(fp);
			}
		}
	}
	return EXIT_SUCCESS;
}
void filecopy(FILE* ifp, FILE* ofp)
{
	int c;
	while ((c=getc(ifp))!= EOF)
		putch(c,ofp);
}
se creo due files:
- t1.txt il cui contenuto e' "file1"
- t2.txt il cui contenuto e' "file2"
e richiamo
blablabla> cat.exe t1.txt t2.txt
la stampa a video è la seguente:
file1
	file2
ossia c'è un tab (credo) che non so da dove esca fuori.
I due file sono stati editati con gVim, aprendoli con Notepad++ ho visto 
che il contenuto (ad esempio di t1.txt) e':
"file1(CR)(LF)"
Potete aiutarmi?
Grazie in anticipo e buona giornata,
Giulio
-- 
OnAir:
http://petrux.blogspot.com

Giulio Petrucci ha scritto:

In Windows se non vado errato il filelinea e' CR+LF mentre in
unix e' solo LF. Il comportamento segnalato sembra mancare del
CR per mandare a capo la linea: forse la open fa qualche assunzione
sul CR+LF e in stile unix e scarta il CR.
Apri il file in modalita' binaria per evitare 'filtraggi' indesiderati.
Bye
Brix

 Apri il file in modalita' binaria per evitare 'filtraggi' indesiderati.
Perfetto, cosi' funziona alla grande.
Ora pero' il problema rimane se chiamo:
 > mycat.exe
ossia senza argomenti: quando scrivo sullo stdin prende le newlines come 
prima :-( cioe' con quella specie di tab... come faccio a evitarlo anche lì?
Ciao,



Probabilmente il file stdin è aperto in modo 'testo' che tra l'altro e' 
un vezzo
specifico del solo Windows ;-)
Vedi se c'e' la possibilita' di mettere in modo binario il file, con
una fctrl ad esempio.
Se no, modifica la filecopy
    while ((c=getc(ifp))!= EOF)
    {
#ifdef __WINDOWS__
      /*
        * Filtro per aggiungere a LF un CR....
        * Solo se il 'file' e' lo stdin o stdout e solo in Windowze...
       */
      if((ifp==stdin)||(ifp==stderr))
    {
          if(c=0x0A)  /* E' un Line feed ? */
               putch(0x0D,ofp);    /* Aggiunge un CR! */
 
    }
#endif
        putch(c,ofp);
     }
Attenzione a non moltiplicare i CR!!! Nel caso, sofistica un po' il 
filtro...
brix

 if ((fp=fopen(*++argv,"r"))==NULL)
if ((fp=fopen(*++argv,"rb"))==NULL)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 una fctrl ad esempio.
Ok, ci provo... intanto inizio a guardarmi la documentazione.
Ora però il problema è un altro: se lancio mycat.exe senza argomenti e 
"smanetto" con lo stdin/stdout, quando lo rilancio il programma torna 
direttamente al prompt (è come se vedesse già da subito il carattere EOF).
Attendo lumi,


 direttamente al prompt (è come se vedesse già da subito il carattere EOF).
  > Attendo lumi,
Mi illumino da solo: nella filecopy bastava aggiungere
if ((ifp==stdin)||(ifp==stderr))
{
	fflush(ifp);
}
Ciao e grazie,
Giulio
-- 
OnAir: Emily Loizeau - "Sur la route"
http://petrux.blogspot.com

 }
Devi aprire il file con il flag "b" come ti ho indicato. Il fflush() sui
flussi di input generalmente non ha senso, infatti secondo lo standard ha
comportamento indefinito.


 Devi aprire il file con il flag "b" come ti ho indicato. 
Ma si puo' aprire lo stdin con "b"?
Ciao,


 Ma si puo' aprire lo stdin con "b"?
Io mi riferivo alla fopen(), per quanto riguarda stdin prova a vedere se
il tuo compilatore supporta setmode().
