|
|
|
|
Strumenti |
09-06-2017, 22:58 | #1 |
Bannato
Iscritto dal: Jun 2017
Messaggi: 11
|
[C] Come estrarre dati da file.txt con stringhe separate dal carattere + ("più") ?
Sono disperato! Sto svolgendo questo esercizio in C e devo prelevare i dati, come nell'esempio che vedete, ma vi è quel + in mezzo ai piedi. Avevo pensato ad una fscanf o carattere per carattere, ma non sono come fare. Qualcuno potrebbe farmi un esempio basato sull'esercizio che vi ho postato? Le funzioni le dovrei saper svolgere, il mio problema è prelevare correttamente i dati e salvarli nella struttura dati (LISTA).
Ecco l'esercizio: https://www.dropbox.com/s/8gjtdxm6fb...cizio.jpg?dl=0 P.S. Sono veramente disperato e ringrazio di cuore chiunque mi possa dare una mano, grazie! |
10-06-2017, 09:06 | #2 |
Senior Member
Iscritto dal: Oct 2010
Messaggi: 1609
|
Ciao e benvenuto nel forum di hwupgrade.
Come ti spiegheranno anche altri, da regolamento è vietato risolvere completamente gli esercizi dati ad altri. Al massimo si può correggere quello che hai già scritto tu. Comunque, se il tuo problema è la lettura dal file skippando il +, la prima cosa che mi viene in mente è un semplice ciclo del tipo Codice:
do { leggo un carattere dal file IF carattere <> + lo aggiungo ad una stringa } while carattere <> +
__________________
Trattative nel mercatino: IronHead - fybpeppe - xcavax Utenti assolutamente DA EVITARE: devilred "Chi c**a sott' 'a neve, pure si ffa 'a bbuca e poi 'a copre, quanno 'a neve se scioje, 'a mm***a vie' sempre fori" T. Milian |
10-06-2017, 21:44 | #3 |
Bannato
Iscritto dal: Jun 2017
Messaggi: 11
|
Studiando online ho trovato la funzione strtok che mi spezzetta le stringhe dai + (più).
Adesso devo acquisire dal file "liste.txt" i dati e faccio così Codice:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 30 #define MAX_LINE 512 struct candidato { char cognome [MAX]; char nome[MAX]; char partito[MAX]; int voti; struct candidato *pun; }; int main(int argc, char *argv[]) { int scelta,i,j,n,righe,uscita; char buff[900]; int elettori; char k; struct candidato*candidati; struct fittizia*buf; int*p; FILE *fp; fp=fopen("liste.txt", "r");if(fp==NULL){ //uscita con exit() segnalando al s.o. con exit(1) che è avvenuto un errore printf("\n\nsi e' verificato un errore relativo al file----errore---clicca un pulsante per uscire"); scanf("%d", &uscita); exit(1);} char buffer[MAX_LINE]; for (n = 1; fgets(buffer, MAX_LINE, fp); n++) { printf("Linea %d => %s", n, buffer); char *str = strtok(buffer, "+"); do { printf ("%s\n", str); } while (str = strtok(NULL, "+")); } |
12-06-2017, 10:04 | #4 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3305
|
A questo punto il problema non è più come splittare una stringa per il carattere '+', ma studiare come funziona lo scope delle variabili, l'allocazione di memoria del C e la gestione delle liste.
Una volta studiati questi 3 elementi è banale risolvere l'esercizio. |
13-06-2017, 13:14 | #5 | |
Bannato
Iscritto dal: Jun 2017
Messaggi: 11
|
Quote:
|
|
13-06-2017, 15:33 | #6 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3305
|
Quote:
1)allocare il primo elemento della lista. 2)copiare le stringhe lette in input sulle relative variabili della struct 3)Allocare il secondo elemento della lista 4)copiare le stringhe ... ... Quindi rispondi a queste domande: 1)Come alloco il primo elemento della lista? 2)come faccio la copia di una stringa in C? E' tutto quello che ti serve per risolvere l'esercizio, se veramente l'hai studiato è semplice. |
|
13-06-2017, 18:47 | #7 |
Bannato
Iscritto dal: Jun 2017
Messaggi: 11
|
Guarda ti invio il codice per l'inserimento ordinato di un intero in una lista
Codice:
struct elemento *inserimento(struct elemento *p) { struct elemento *p0, *p1; int posizione; /* Creazione elemento */ p0 = (struct elemento *)malloc(sizeof(struct elemento)); printf("\nInserire l'informazione (un numero intero): "); scanf("%d", &p0->inf); if(p==NULL) { /* se la lista è vuota, l'elemento */ p = p0; /* diventa il primo e unico della lista */ p->pun = NULL; } else { if(p->inf > p0->inf) { /* se il valore dell'elemento è */ p0->pun = p; /* inferiore al primo l'elemento */ p = p0; /* diventa il primo della lista */ } else { /* ricerca della posizione di inserimento */ p1 = p; posizione = 0; while(p1->pun!=NULL && posizione!=1) { if(p1->pun->inf < p0->inf) p1 = p1->pun; /* scorre in avanti p1 */ else posizione = 1; /* interrompe lo scorrimento */ } p0->pun = p1->pun; /* connessione all'elemento successivo */ p1->pun = p0; /* connessione dall'elemento precedente */ } } return(p); /* ritorno del puntatore all'inizio della lista */ } Ma non so andare avanti perchè se hai visto l'esercizio, poi mi perdo quando devo scansionare tutta la lista alla ricerca dei voti o dei partiti da conteggiare per le funzioni da creare per l'esercizio. Come devo fare? |
13-06-2017, 22:01 | #8 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3305
|
Risolvi un problema alla volta, prima costruisci la lista e solo poi vedremo il problema della ricerca.
Quel codice di inserimento in lista non è sufficientemente generico da essere applicato senza modifiche al tuo caso. Scrivi del codice attinente al tuo esercizio invece di copiare pezzi di codice a caso |
15-06-2017, 16:17 | #9 |
Bannato
Iscritto dal: Jun 2017
Messaggi: 11
|
Ma una curiosità? Ma voi vi divertite a perculare chi vi chiede un cavolo di aiuto? Perchè ho notato che nei forum, preferiscono tirarla per le lunghe o insultare come hai fatto tu con il "Codice a caso" o con il classico tono "Io sono Bill Gates, quindi ti tratterò come una scimmia".
Un piffero di aiuto cercavo ed invece sempre che il brodo si allunga e mi devo sorbire pure gli insulti. |
15-06-2017, 17:13 | #10 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3305
|
Quote:
Invece rispondi con un pezzo di codice copiato da qualche altro esercizio che non è applicabile al caso in questione. Potevi almeno fare uno sforzo e modificarlo in modo che facesse un inserimento in una lista di "candidato" invece che di "elemento" In realtà pare proprio che tu non abbia studiato granchè e qui gli esercizi non si risolvono come da regolamento. |
|
15-06-2017, 20:47 | #11 | |
Bannato
Iscritto dal: Jun 2017
Messaggi: 11
|
Quote:
|
|
15-06-2017, 20:49 | #12 | |
Bannato
Iscritto dal: Jun 2017
Messaggi: 11
|
Quote:
A voce pure io lo so dire cosa devo fare, e l'avrei saputo dire anche senza studiare il C o altri linguaggi, ma usando solo il cervello. Mi avete stufato, fancetera, vi credete fenomeni ma non lo sapete fare neanche voi. |
|
15-06-2017, 20:51 | #13 | |
Bannato
Iscritto dal: Jun 2017
Messaggi: 11
|
Quote:
|
|
16-06-2017, 09:48 | #14 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3305
|
Quote:
Facciamo così prima posta la tua soluzione corretta dell'esercizio che poi io ti posto la mia, vediamo chi non lo sa fare |
|
17-06-2017, 15:25 | #15 |
Bannato
Iscritto dal: Jun 2017
Messaggi: 11
|
|
17-06-2017, 15:26 | #16 | |
Bannato
Iscritto dal: Jun 2017
Messaggi: 11
|
Quote:
|
|
17-06-2017, 15:28 | #17 | |
Bannato
Iscritto dal: Jun 2017
Messaggi: 11
|
Quote:
|
|
17-06-2017, 15:52 | #18 | ||||
Senior Member
Iscritto dal: Jul 1999
Città: Black Mesa
Messaggi: 72348
|
Quote:
Quote:
Quote:
Quote:
utente ovviamente bannato CLOSED!! >bYeZ<
__________________
REGOLAMENTO & update1/update2 | IO C'ERO | Realme X3 SZ 12/256 - History | GTi is BACK
"Non sorridete.......gli spari sopra.....sono per VOI!" |
||||
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:18.