Lettura e Scrittura con elaborazione FILE testo

di il
36 risposte

Lettura e Scrittura con elaborazione FILE testo

Ciao ragazzi, sono nuovo del forum e seguo molte le vostre discussioni.
Ho un problema nella realizzazione di un programma in C per automatizzare un output da programma di file.txt . Vi spiego qual è il mio obiettivo:
1) leggere un file testo del tipo FILE *fp, vedi allegato
2) memorizzare il contenuto di questo file in vettori e/o matrici per poi elaborarne il contenuto
3) tutte le tabelle iniziano con Table: nome tabella, il problema è che non i file hanno sempre le stesse tabelle (mi spiego io seleziono l'output di 14 tabelle, però alcune possono anche non esserci in quel specifico esercizio). Ma ogni tabella è sempre separata dall'altra dalla presenza di 2 righe vuote.


Al momento ho realizzato un programma che apre un file digitato dall'utente file.txt (presente nella stessa cartella del file) che utilizza la funzione strstr(*file, "Table: nome file") per individuare la tabella o tabelle da me scelta, e un contatore di righe e caratteri per individuarne la posizione. Questo perché posso attraverso un rewind(fp) e posizionarmi nel file attraverso la funzione fseek(fp,contcarattere,SEEK_SET) decidere di stampare a video e successivamente scrive in un nuovo file il testo rielaborato.

Vorrei isolarmi le singole tabelle e poi memorizzare il contenuto in una matrice per fare delle modifiche.

Spero di esser stato chiaro e che qualcuno mi possa aiutare
Allegati:
26801_cf44ebb74e4ad9afc292ddadcc9a613f.png
26801_cf44ebb74e4ad9afc292ddadcc9a613f.png

36 Risposte

  • Re: Lettura e Scrittura con elaborazione FILE testo

    E il tuo codice dov'è? Dove hai difficoltà esattamemte?
  • Re: Lettura e Scrittura con elaborazione FILE testo

    #include <iostream>
    #include <fstream>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #define MAXSTR 500

    using namespace std;

    int main(){
    char testo[500];
    char tmpstr[MAXSTR];
    char vettore[500];
    int cntlines = 0, cntcar=0, cntcarattere=0;
    char * parola;
    FILE *fp;
    int i1=0,icar=0,i2=0,icar2=0;
    int ch;
    char r;
    cout<<"Inserisci testo da caricare seguito da .txt"<<endl;
    cin>>testo;
    fp = fopen(testo, "r");
    bool trovato=false;

    if (fp)
    {
    while (!feof(fp))
    {
    if (fgets(tmpstr, MAXSTR, fp) != NULL)
    {
    //conta righe
    if(parola=strstr(tmpstr,"Table:")){//cerca la frase in una riga
    if( trovato=true){
    i2=cntlines; //individuazione riga
    icar2=cntcarattere; //individuazione del carattere
    printf(tmpstr);
    printf("%d %d\n",i2,icar2);
    trovato=false;
    }
    }
    if(parola=strstr(tmpstr,"Table: Load Pattern")){//cerca la frase in una riga
    i1=cntlines; //individuazione riga
    icar=cntcarattere; //individuazione del carattere
    printf(tmpstr);
    trovato= true;
    printf("%d %d\n",i1,icar); // 6305369
    fseek (fp,icar,SEEK_SET);
    // if(parola=strstr(tmpstr,"Table: "))i2=cntlines;
    }

    cntlines++;
    cntcarattere=strlen(tmpstr)+cntcarattere;
    }
    }

    }


    rewind(fp);
    ch=fgetc(fp);
    while (ch!=EOF)
    {
    cntcar++;
    ch=fgetc(fp);
    }


    rewind(fp);
    fseek (fp,icar,SEEK_SET);
    if (fgets(tmpstr, MAXSTR, fp) != NULL)
    {
    for(int i=i1;i<i2;i++){
    fgets(vettore,500,fp);
    printf("%s", vettore);
    }
    }


    fclose(fp);
    printf("%d\n",cntcar);
    printf("%d\n",cntcarattere);
    printf("\n");
    printf("righe lette: %d\n", cntlines);
    // getchar();

    return 0;
    system("pausa");
    }
  • Re: Lettura e Scrittura con elaborazione FILE testo

    Ciao Oregon la difficoltà è che non riesco ad estrapolare la tabella che voglio, nel senso una volta che riesco ad individuare la riga contenente ad esempio Table: Base Reactions, vorrei estrapolare la parte di testo fino ad incontrare il doppio rigo vuoto
  • Re: Lettura e Scrittura con elaborazione FILE testo

    In questo codice ho provato ad inserire una variabile bool trovato che inizialmente è false, per cui una volta che trova la mia riga e diventa trovato=true conosco il numero di caratteri corrispondenti a quella tabella, per conoscere la fine (che può essere variabile) ho utilizzato la variabile bool per avere un contatore successivo icar2....in modo da stampare e memorizzare da icar1 a icar2
  • Re: Lettura e Scrittura con elaborazione FILE testo

    Non ho visto il codice in modo approfondito ma if con = è sicuramente sbagliato
  • Re: Lettura e Scrittura con elaborazione FILE testo

    Si immagino per la questione dell'operatore logico ==....

    #include <iostream>
    #include <fstream>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #define MAXSTR 500

    using namespace std;

    int main(){
    char testo[500];
    char tmpstr[MAXSTR];
    char vettore[500];
    int cntlines = 0, cntcar=0, cntcarattere=0;
    char * parola;
    FILE *fp;
    int i1=0,icar=0,i2=0,icar2=0;
    int ch;
    char r;
    cout<<"Inserisci testo da caricare seguito da .txt"<<endl;
    cin>>testo;
    fp = fopen(testo, "r");
    bool trovato=false;
    int posizione;

    if (fp)
    {
    while (!feof(fp))
    {
    if (fgets(tmpstr, MAXSTR, fp) != NULL)
    {
    //conta righe

    if(strstr(tmpstr,"Table: Load Pattern")!=NULL){//cerca la frase in una riga
    posizione=ftell(fp);
    printf("%d", posizione);
    i1=cntlines; //individuazione riga
    icar=cntcarattere; //individuazione del carattere
    printf(tmpstr);
    trovato= true;
    printf("%d %d\n",i1,icar); // 6305369
    // if(parola=strstr(tmpstr,"Table: "))i2=cntlines;
    }
    /*if(parola=strstr(tmpstr,"Table:")){//cerca la frase in una riga
    if( trovato=true){
    i2=cntlines; //individuazione riga
    icar2=cntcarattere; //individuazione del carattere
    printf(tmpstr);
    printf("%d %d\n",i2,icar2);
    trovato=false;
    }
    }*/

    cntlines++;
    cntcarattere=strlen(tmpstr)+cntcarattere;
    }
    }

    }


    rewind(fp);
    ch=fgetc(fp);
    while (ch!=EOF)
    {
    cntcar++;
    ch=fgetc(fp);
    }


    rewind(fp);
    fseek (fp,posizione,SEEK_SET);
    if (fgets(tmpstr, MAXSTR, fp) != NULL)
    {
    for(int i=posizione;i<posizione+12;i++){
    fgets(vettore,500,fp);
    printf("%s", vettore);
    }
    }


    fclose(fp);
    printf("%d\n",cntcar);
    printf("%d\n",cntcarattere);
    printf("\n");
    printf("righe lette: %d\n", cntlines);
    // getchar();

    return 0;
    system("pausa");
    }
  • Re: Lettura e Scrittura con elaborazione FILE testo

    Con questo porzione di codice riesco ad estrarre quasi bene la parte di testo, ma vorrei fermarmi non appena incontra o il doppio rigo vuoto o la parola Table: perché significherebbe che è iniziata una altra tabella....
    Non riuscendoci ho dovuto stampare le prime 12 righe ( manualmente) dopo che ho trovato Table: Load Pattern....
    poi nel codice ho fatto un confronto per capire se leggevo bene tutti i caratteri infatti troverai un ciclo "inutile"

    rewind(fp);
    ch=fgetc(fp);
    while (ch!=EOF)
    {
    cntcar++;
    ch=fgetc(fp);
    }
  • Re: Lettura e Scrittura con elaborazione FILE testo

    Usa i tag code per postare il codice o non si capisce.

    E posta un file di dati d'esempio (non uma foto)
  • Re: Lettura e Scrittura con elaborazione FILE testo

    
    #include <iostream>
    #include <fstream>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h> 
    #define MAXSTR        500
    
    using namespace std;
    
    int main(){
    	char testo[500];
        char tmpstr[MAXSTR];
        char vettore[500];
        int cntlines = 0, cntcar=0, cntcarattere=0;
        char * parola;
        FILE *fp;
        int i1=0,icar=0,i2=0,icar2=0;
        int ch;
        char r;
        cout<<"Inserisci testo da caricare seguito da .txt"<<endl;
    	cin>>testo;
        fp = fopen(testo, "r");
        bool trovato=false;
        int posizione;
        
        if (fp)
        {
            while (!feof(fp))
            {
                if (fgets(tmpstr, MAXSTR, fp) != NULL)
                {
    				                     //conta righe6330492
    				
                	if(strstr(tmpstr,"Table:  Load Pattern")!=NULL){//cerca la frase in una riga
                	posizione=ftell(fp);
    				printf("%d\n", posizione);
    				i1=cntlines;      //individuazione riga 
    				icar=cntcarattere;    //individuazione del carattere
                    printf("%s",tmpstr);
                    trovato= true;
                   // printf("%d  %d\n",i1,icar);   // 6305369 
                                   		// if(parola=strstr(tmpstr,"Table:  "))i2=cntlines;
               		}
               		if(trovato==true && ftell(fp)>posizione){
               			i2=ftell(fp);
               			trovato= false;
    				   }
               		/*if(parola=strstr(tmpstr,"Table:")){//cerca la frase in una riga
    					if( trovato=true){
    						i2=cntlines;      //individuazione riga 
    						icar2=cntcarattere;    //individuazione del carattere
                   			printf(tmpstr);
                    		printf("%d  %d\n",i2,icar2);   
                    		trovato=false;
    					}
               		}*/
               		
    			cntlines++;
    			cntcarattere=strlen(tmpstr)+cntcarattere;
                }
            }
            
        }
        
        
        rewind(fp);
        ch=fgetc(fp);
        while (ch!=EOF)
        {
          	cntcar++;
        	ch=fgetc(fp);
        }       
            
            
        rewind(fp);
        fseek (fp,posizione,SEEK_SET);
    if (fgets(tmpstr, MAXSTR, fp) != NULL)
        {
            for(int i=posizione;i<i2;i++){
                fgets(vettore,500,fp);
           		printf("%s", vettore);
            }
        }
        
        
        fclose(fp);
        printf("%d\n",cntcar);
        printf("%d\n",cntcarattere);
        printf("\n");
        printf("righe lette: %d\n", cntlines);
       // getchar();
    
        return 0;
    	system("pausa");
    }
    [\code]
    
    
    Vorrei fermarmi alla fine della Tabella Load Pattern.....per poi memorizzarla in una matrice
    
    Allegati:
    26801_2b740008f2b61b00342d2fb618d284ee.png
    26801_2b740008f2b61b00342d2fb618d284ee.png
  • Re: Lettura e Scrittura con elaborazione FILE testo

    Il file dati non l'hai postato
  • Re: Lettura e Scrittura con elaborazione FILE testo

    Oregon hai ragione
    scusami ma non riesco ad allegare txt
    comunque puoi creare un file di questo tipo:
    • SAP2000 v17.2.0 6/1/15 2:55:32

      Table: Load Pattern Definitions

      LoadPat DesignType SelfWtMult AutoLoad GUID Notes

      G1 DEAD 1.000000 34efceb7-7735-489b-b4f8-b1d1576693e6
      G2 SUPER DEAD 0.000000 c268cb6f-d770-4b80-9cac-96ac50342db9
      Q1 LIVE 0.000000 72c58a75-018a-4ce2-a090-36691c48944b
      Q2 LIVE 0.000000 af4ed40a-7dc1-477d-b019-a4b70161f0c0
      Wx WIND 0.000000 None 13aedbb0-b0bd-4704-84d3-de13118b211d
      Wy WIND 0.000000 None 3a64e9c2-39f8-4e4e-a40c-7bd2fb9dbc4c
      Ed,x QUAKE 0.000000 Italian NTC 2008 8ffdebd8-a886-4626-8f41-2718edaec672
      Ed,y QUAKE 0.000000 Italian NTC 2008 c014bc44-c881-4f04-b589-9f121644785b
      Ee,x QUAKE 0.000000 Italian NTC 2008 ae35ed73-5ed2-4b50-b9d7-d6d2ccef72b5
      Ee,y QUAKE 0.000000 Italian NTC 2008 15bcc7aa-d855-47d9-8fb9-be06c67d78f3


      Table: Material List 1 - By Object Type

      ObjectType Material TotalWeight NumPieces
      KN
      Frame S235 171.654 155


      Table: Material List 2 - By Section Property

      Section ObjectType NumPieces TotalLength TotalWeight
      m KN
      HE280B Frame 4 59.20000 59.694
      HE200A Frame 21 84.71449 35.081
      IPE200 Frame 4 10.80000 2.369
      IPE160 Frame 12 37.24200 5.762
      UPN280 Frame 5 27.00000 11.098
      IPE180 Frame 10 50.00000 9.198
      L90X9 Frame 2 5.31507 0.635
      IPE140 Frame 20 72.00000 9.089
      2L90X9/10/ Frame 13 35.97519 8.595
      2L90X9/244 Frame 24 69.03806 16.357
      UPN180 Frame 13 20.80723 4.478
      2UPN140/10/ Frame 2 5.65685 1.773
      HE180B Frame 2 2.23000 1.121
      IPE240 Frame 2 12.00000 3.612
      UPN120 Frame 21 21.36000 2.792
  • Re: Lettura e Scrittura con elaborazione FILE testo

    Ripartirei da codice di base per individuare le righe che ti servono. Poi dirai meglio cosa ci devi fare, con la testata, con i vari campi, ecc...
    
    int main()
    {
    	FILE *fp = fopen("file.txt", "r");
    	if (!fp)
    	{
    		puts("Errore apertura file dati\n");
    		return -1;
    	}
    
    	bool fnd = false;
    	int erow = 0;
    	char tmpstr[MAXSTR];
    	while (fgets(tmpstr, MAXSTR, fp))
    	{
    		char *p = strstr(tmpstr, "Table: Load Pattern");
    		if (p) fnd = true;
    		int slen = strlen(tmpstr);
    		if (slen == 1) erow++; else erow = 0;
    		if (erow == 2) fnd = false;
    
    		if(fnd && slen>1) printf("%s", tmpstr);	
    	}
    
    	fclose(fp);
    
    	return 0;
    }
    
    
  • Re: Lettura e Scrittura con elaborazione FILE testo

    Grazie Oregon, si le tabelle che normalmente seleziono sono 14 più o meno però possono o meno esserci... L'idea è che se individua la tabella ad esempio Load Pattern ne memorizzi il contenuto in una matrice eliminando in questo caso (Load Pattern) le ultime due colonne memorizzandole in un nuovo file.txt... questa operazione di elaborazione la intendo fare alle diverse tabelle memorizzandole (accodandole una sotto l'altra)
  • Re: Lettura e Scrittura con elaborazione FILE testo

    Non ho capito bene... vuoi riscrivere tutto tranne gli ultimi due campi in un altro file?
Devi accedere o registrarti per scrivere nel forum
36 risposte