prendere riga composta da numeri e stampare spazio

toni1705

Nuovo Utente
98
9
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:
 

Dawking

Utente Attivo
369
119
CPU
Ryzen 3 1200
Scheda Madre
ASROCK AB350M
HDD
1 TB, 7200 RPM, SATA 6 GB/s, 64 MB Cache 3.5 " + SSD S3+ 240GB
RAM
16GB (2 x 8GB) DDR4, 3000MHz G.Skill Aegis
GPU
RX 570 4gb
Monitor
HP 22fw
PSU
Power SupplyBe Quiet System Power B9 450W
Case
Noua Noob X1 RGB
Net
TP-LINK – WIRELESS USB 300MBPS
OS
Windows 10 PRO
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.
 
  • Mi piace
Reazioni: toni1705

toni1705

Nuovo Utente
98
9
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
 

Dawking

Utente Attivo
369
119
CPU
Ryzen 3 1200
Scheda Madre
ASROCK AB350M
HDD
1 TB, 7200 RPM, SATA 6 GB/s, 64 MB Cache 3.5 " + SSD S3+ 240GB
RAM
16GB (2 x 8GB) DDR4, 3000MHz G.Skill Aegis
GPU
RX 570 4gb
Monitor
HP 22fw
PSU
Power SupplyBe Quiet System Power B9 450W
Case
Noua Noob X1 RGB
Net
TP-LINK – WIRELESS USB 300MBPS
OS
Windows 10 PRO
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:
 
  • Mi piace
Reazioni: toni1705

Zeus Giove

Nuovo Utente
21
11
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
 

Andretti60

Utente Èlite
6,440
5,091
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)
 
  • Mi piace
Reazioni: Dawking e toni1705

toni1705

Nuovo Utente
98
9
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
Post unito automaticamente:

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:

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!