prendere riga composta da numeri e stampare spazio

Pubblicità

toni1705

Nuovo Utente
Messaggi
98
Reazioni
9
Punteggio
28
Avrei bisogno di leggere da un file txt una riga di numeri
es.
62 84 85 66 07 65
84 23 50 15 76 51
71 41 31 80 67 63
51 07 14 01 53 08
Riesco a leggere tutte le righe ma non riesco a riproporre lo stesso principio visivo
ossia i numeri che vengono letti ,sono disposti in output su unica riga.
come posso separare le righe?
vorrei inoltre poter ricercare una coppia di numeri e se in caso fosserò già usciti sulla stessa riga, stampare un messaggio;
se ci fossero state stringhe avrei utilizzato strcmp per la ricerca ..
Idee????
questo è il codice
C:
#include <stdio.h>
#include <stdlib.h>

int main()
{
 FILE *fd;
 fd=fopen("C:/Users/TONI/Downloads/1897.txt","r");
 int i,a[30];
 if(fd==NULL)
 {
     printf("Errore in apertura file...");
     exit(1);
 }
 for(i=0;i<24;i++)
    {
    fscanf(fd,"%d",&a[i]);
    printf("%d ",a[i]);
    }
}
mi dispiace dover rompere sempre le balle :cry:
 
Concordo con @Andretti60, potresti usare la fgets() così leggendo una riga per volta avresti un ciclo for più breve e un programma leggermente più ottimizzato, inoltre ti verrebbe anche più comodo aggiungere il "\n" alla fine di ogni iterazione.
Andando a leggere ogni singolo elemento, invece, dovresti poi tenere un contatore per sapere quando arrivi al sesto e ultimo elemento della riga per poi andare ad aggiungere il "\n" e questo aumenterebbe solo le linee di codice "inutilmente".
Ovviamente sei libero di impostare il programma come meglio ritieni, soprattutto ti consiglio di impostarlo con una logica che capisci appieno quello che fa e perchè lo fa.
 
Ci avevo provato con la fgets prima di postare e non sono riuscito nell'intento.
(genera numeri alti casuali e diversi 0.)
però avevo letto che la fgets legge array di tipo char e non di tipo int
(sarebbe comodo per me capire dove sbaglio)
ho ovviato,ascoltato il consiglio di @Andretti60 ,al problema stampando una \n ogni 6 numeri?
come ho fatto?
C:
  if (i % 6 == 0) //se multiplo di 6
         {
         printf("\n");
         }
è una pazzia però fa il suo dovere
 
Ci avevo provato con la fgets prima di postare e non sono riuscito nell'intento.
(genera numeri alti casuali e diversi 0.)
però avevo letto che la fgets legge array di tipo char e non di tipo int
(sarebbe comodo per me capire dove sbaglio)
ho ovviato,ascoltato il consiglio di @Andretti60 ,al problema stampando una \n ogni 6 numeri?
come ho fatto?
C:
  if (i % 6 == 0) //se multiplo di 6
         {
         printf("\n");
         }
è una pazzia però fa il suo dovere
L'importante è che funzioni e sei riuscito nel tuo intento! :ok:
 
Domanda, tu dici "se fosserl state stringhe avrei usato ..." ma perché non puoi usarlo lo stesso? Trattasi di lettuea da file, quindi leggi stringhe, seppur composte parzialmente da caratteri numerici
 
Ci avevo provato con la fgets prima di postare e non sono riuscito nell'intento.
(genera numeri alti casuali e diversi 0.)
però avevo letto che la fgets legge array di tipo char e non di tipo int
(sarebbe comodo per me capire dove sbaglio)
ho ovviato,ascoltato il consiglio di @Andretti60 ,al problema stampando una \n ogni 6 numeri?
come ho fatto?
C:
  if (i % 6 == 0) //se multiplo di 6
         {
         printf("\n");
         }
è una pazzia però fa il suo dovere
Non e' una pazzia, funziona anche se e', beh, brutto a vedersi :)
Un'altra possibile soluzione e' spezzare il for() in due for() innestati, e stampare il newline alla fine di ogni ciclo interno. Non dico sia meglio...

Io in genere quando leggo un documento di testo preferisco leggere una linea alla volta, mettendola in una stringa (vettore di caratteri, in C), poi utilizzo metodi che elaborano le stringhe per ottenere quello che che voglio. E continuo a leggere fino alla fine del file (ossia mi fermo guando fgets ritorna NULL)
Per esempio, nel tuo caso puoi usare un semplice sscanf() per leggere i sei valori interi. Io invece spezzerei la stringa, usando lo spazio come separatore, in piu' sotto-stringhe, e poi convertirei ogni sottostringa in una variabile intera. In questo modo il programma e' piu' generico, funziona per ogni numero di linee all'interno del file, e ogni numero di interi in ciascuna linea, senza contare il controllo di errore (ossia trovare una stringa che non puo' essere convertita in un numero intero)
 
Domanda, tu dici "se fosserl state stringhe avrei usato ..." ma perché non puoi usarlo lo stesso? Trattasi di lettuea da file, quindi leggi stringhe, seppur composte parzialmente da caratteri numerici
perchè mi genera numeri casuali. Non saprei dove vado a sbagliare
--- i due messaggi sono stati uniti ---
Non e' una pazzia, funziona anche se e', beh, brutto a vedersi :)
Un'altra possibile soluzione e' spezzare il for() in due for() innestati, e stampare il newline alla fine di ogni ciclo interno. Non dico sia meglio...

Io in genere quando leggo un documento di testo preferisco leggere una linea alla volta, mettendola in una stringa (vettore di caratteri, in C), poi utilizzo metodi che elaborano le stringhe per ottenere quello che che voglio. E continuo a leggere fino alla fine del file (ossia mi fermo guando fgets ritorna NULL)
Per esempio, nel tuo caso puoi usare un semplice sscanf() per leggere i sei valori interi. Io invece spezzerei la stringa, usando lo spazio come separatore, in piu' sotto-stringhe, e poi convertirei ogni sottostringa in una variabile intera. In questo modo il programma e' piu' generico, funziona per ogni numero di linee all'interno del file, e ogni numero di interi in ciascuna linea, senza contare il controllo di errore (ossia trovare una stringa che non puo' essere convertita in un numero intero)
quella suggerita da te è un metodo molto furbo... appena ho tempo proverò a smanettare un pochino
 
Ultima modifica:
Pubblicità
Pubblicità
Indietro
Top