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;
}