[C] Problema con gestione txt

di il
10 risposte

[C] Problema con gestione txt

Salve a tutti ho un problema con un mio programma C e volevo sapere se qualcuno fosse in grado di aiutarmi.
In pratica ho 2 file txt con cui devo creare un nuovo file txt con l'unione delle righe del primo e del secondo: ad esempio ho queste 3 stringhe :
310116 1 260116 3666 FATTURA RICEVUTA 0201 0477 JUNGHEINRICH ITALIANA SRL EUR 204,96 (tutta una riga)
45 45 22,00 IVA 22% 168,00 36,96 (stringa collegata a quella prima)
7 DI.BA SAS 0201 0001 SOGGETTO(stringa secondo documento)

Quindi io devo leggere la stringa, controllare la presenza di una data(che è la prima cosa che leggo). Dopo aver letto la prima stringa leggo tutta la stringa ed estrapolo il nome; dopo aver fatto ciò apro il secondo file da cui leggo ogni stringa e ne estrapolo il nome e lo confronto con il nome letto inizialmente. Se i nomi corrispondono salvo la stringa del secondo documento e continuo a leggere nel primo concatenando ogni stringa collegata a quella che ho letto inizialmente e se incontro un'altra stringa con data, concateno anche la stringa del secondo file alla stringa iniziale e la inserisco nel nuovo file txt mantenendo tutto nella stessa riga.
Ora ho testato più volte il codice con diverse varianti ma ritengo che quest'ultimo sia il più efficacie seppur mi da errore di segmentation fault che non riesco a risolvere.

Incollo il codice:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

FILE *fp,*fp1,*fp2;

char stringa[156],ragione_sociale[100],stringa_s[300];
char stringa1[156],ragione_sociale1[100],stringa1_s[300];

void inizializza();
void chiudi();
void ragione_IVA();
void ragione_FOR();
int controllo_data(int,int);
int controllo_nome(int);
int controllo_stringa();

int main() {
	int x=0;
	inizializza();
	ragione_IVA();
	chiudi();
	system("pause");
}

void ragione_FOR() {
	int y,num,z=0;
	char c1;
	fscanf(fp2,"%d",&num);
	fgets(stringa1,400,fp2);
	for(y=0; y<41; y++) {
		c1=stringa1[y];
		ragione_sociale1[z]=c1;
		z++;
	}
}

void ragione_IVA() {
	int data,x,i=0,s,ss;
	char c;
	fscanf(fp,"%d",&data);
	fgets(stringa,156,fp);
	while(!feof(fp)) {
		s=controllo_data(data,s);
		if(s==1) {
			for(x=60; x<102; x++) {
				c=stringa[x];
				ragione_sociale[i]=c;
				i++;
			}
			//ragione_FOR();
			ss=controllo_nome(ss);
			if(ss==1) {
				strcpy(stringa1_s,stringa1);
			}
			strcpy(stringa_s,stringa);
			fscanf(fp,"%d",&data);
			fgets(stringa,156,fp);
		} else {
			strcat(stringa_s,stringa);
			strcat(stringa_s,stringa1);
			fprintf(fp1,"%d ",&data);
			fprintf(fp1,"%s ",stringa_s);
			fscanf(fp,"%d",&data);
			fgets(stringa,156,fp);
		}
	}
}

void inizializza() {
	fp=fopen("IVA.txt","r");
	if(fp==NULL) {
		perror("Error");
		return;
	}
	fp2=fopen("FOR.txt","r");
	if(fp2==NULL) {
		perror("Error");
		return;
	}
	fp1=fopen("IVA-FOR.txt","w");
	if(fp1==NULL) {
		perror("Error");
		return;
	}
}

void chiudi() {
	fclose(fp);
	fclose(fp1);
	fclose(fp2);
}

int controllo_data(int data,int s) {
	if(data>10000) {
		s=1;
	} else {
		s=0;
	}
	return s;
}

int controllo_nome(int ss){
	if(strcmp(ragione_sociale,ragione_sociale1)==0){
		ss=1;
	}else{
		ss=0;
	}
	return ss;
}

10 Risposte

  • Re: [C] Problema con gestione txt

    Ma quel 400 ?
  • Re: [C] Problema con gestione txt

    Quel 400 riguardava la lunghezza della stringa. All'inizio avevo considerato una grandezza molto ampia. La grandezza di quella stringa dovrebbe aggirasi intorno ai 115.
    La presenza della funzione messa a commento era solamente per effettuare un test con il primo file.
  • Re: [C] Problema con gestione txt

    Ma se il buffer non è lungo 400 NON devi indicare 400 come massimo perché potresti avere un errore di segmentation
  • Re: [C] Problema con gestione txt

    Ok quello l'ho cambiato ma quello era l'unico buffer a cui indicavo più spazio di quello che aveva ma non comprendo perchè non riesco a ciclare completamente il primo file applicando le funzioni da me scritte. Potrebbe essere un errore logico il segmentation fault? Se così fosse conosci un buon metodo per risolverlo?
  • Re: [C] Problema con gestione txt

    Il contenuto dei file txt qual è?
  • Re: [C] Problema con gestione txt

    Queste sono alcune righe del primo file txt:
    310116 1 260116 3666 FATTURA RICEVUTA 0201 0477 JUNGHEINRICH ITALIANA SRL EUR 204,96
    243 45 45 22,00 IVA 22% 168,00 36,96
    310116 1/A 310116 10290794 FATTURA ACQUISTO C 0201 1984 REALS EUR 491,66
    296 46 46 22,00 IVA 22% INTRA 403,00 88,66
    310116 2 310116 16000102 FATTURA RICEVUTA 0201 1610 RCM SPA EUR 145,42
    244 45 45 22,00 IVA 22% 119,20 26,22
    310116 3 250116 3237 FATTURA RICEVUTA 0201 0477 JUNGHEINRICH ITALIANA SRL EUR 190,61
    245 45 45 22,00 IVA 22% 156,24 34,37
    310116 4 300116 142 FATTURA RICEVUTA 0201 2481 PIANGIARELLI RICAMBI SRL EUR 503,15
    246 45 45 22,00 IVA 22% 412,42 90,73
    Queste invece sono del secondo:
    7 DI.BA SAS 0201 0001 SOGGETTO

    10 COMUNE DI MONTECOSARO 0201 2098 SOGGETTO

    2 SAVINO DEL BENE SPA 0201 0458 SOGGETTO

    13 TREFFE SRL 0201 0002 SOGGETTO
  • Re: [C] Problema con gestione txt

    Ovviamente questa

    fprintf(fp1,"%d ",&data);

    è sbagliata e dovrebbe essere

    fprintf(fp1,"%d ",data);

    Così non ho alcun errore.
  • Re: [C] Problema con gestione txt

    Ok, questo errore l'ho intravisto questa mattina e già risolto ma ho notato che non riesco a far funzionare correttamente lo strcat. Ritieni che ho passato male qualche stringa ?
  • Re: [C] Problema con gestione txt

    Quale strcat? Cosa intendi con "non riesco a far funzionare"?


    Hai ancora il seg fault? I risultati sono quelli attesi? Dicci qualcosa in più ... Se continui ad essere vago, non sarà possibile darti un aiuto ...
  • Re: [C] Problema con gestione txt

    Allora dopo alcuni tentativi ho risolto anche il problema dello strcat di cui parlavo sopra ovvero che dovevo unire più stringhe in una singola riga prima di inserirle nel file. Ora però ho notato che seppur le concateno una con l'altra i caratteri di fine stringa rimangono e quindi nel momento in cui utilizzo la funzione per inserire la stringa all'interno del file quest'ultime non vengono stampate una di seguito all'altra(sul file) ma le inserisce andando sempre a capo.
    Esempio utilizzando le stringhe scritte sopra:
    310116 1 260116 3666 FATTURA RICEVUTA 0201 0477 JUNGHEINRICH ITALIANA SRL EUR 204,96 243 45 45 22,00 IVA 22% 168,00 36,96
    Ecco il primo passo è concatenare la stringa con la data (in questo caso 310116) con le stringhe che si trovano sotto che le riguardano, ovvero le righe in cui è descritta l'Iva.
    Dopo aver fatto ciò devo creare una funzione che dalla stringa con la data:
    310116 1 260116 3666 FATTURA RICEVUTA 0201 0477 JUNGHEINRICH ITALIANA SRL EUR 204,96(ESEMPIO), estragga il nome JUNGHEINRICH ITALIANA SRL. Dopo aver estratto il nome devo aprire il secondo file in cui ci sono stringhe del tipo:
    7 DI.BA SAS 0201 0001 SOGGETTO
    Quindi devo ciclare il secondo file fine alla fine leggendo ogni stringa, ed estrapolandone ogni nome, come in questo caso DI.BA SAS, e confrontarlo col nome estrapolato dalla stringa con data del primo documento. Se corrisponde il nome devo concatenare anche questa stringa ottenendo cosi:
    310116 1 260116 3666 FATTURA RICEVUTA 0201 0477 JUNGHEINRICH ITALIANA SRL EUR 204,96 243 45 45 22,00 IVA 22% 168,00 36,96 1021 JUNGHEINRICH ITALIANA SRL 0201 0477 SOGGETTO
    I problemi descritti prima riguardavano principalmente la concatenazione che risolto sviluppando in più parti il codice per far si che non mi si confondesse il tutto.

    Quindi il problema è che non riesco ad estrarre bene i nomi dalle stringhe ed a confrontarle.
Devi accedere o registrarti per scrivere nel forum
10 risposte