Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C] Problema con acquisizione stringhe da file

    Stavo provando ad acquisire dei dati da file in una stringa e poi portarli in una matrice ma non riesco. Arriva fino alla terza riga e poi si pianta. Dov'è sbagliato l'algoritmo? Grazie

    file in questione:
    .GATTO.....LINO
    .A.O....A..A..A
    .S.RITORNO.U...
    ...I....N..R...
    ...N...SOGNO...
    POMODORO......

    codice:
     while(fgets(str,N,ff)!=NULL){
            len=strlen(str);
                if(str[len-1]=='\n'){
                    str[len-1]='\0';
                    len=len-1;}
    
            for(i=0;i<N+2;i++)
                matrix[righe+1][i]='.';
    
            for(i=0;i<len;i++){
                matrix[righe+1][i]=str[i];
            }
        righe++;}

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Quote Originariamente inviata da wFree Visualizza il messaggio
    Stavo provando ad acquisire dei dati da file in una stringa e poi portarli in una matrice ma non riesco. Arriva fino alla terza riga e poi si pianta. Dov'è sbagliato l'algoritmo? Grazie

    file in questione:
    .GATTO.....LINO
    .A.O....A..A..A
    .S.RITORNO.U...
    ...I....N..R...
    ...N...SOGNO...
    POMODORO......

    codice:
     while(fgets(str,N,ff)!=NULL){
            len=strlen(str);
                if(str[len-1]=='\n'){
                    str[len-1]='\0';
                    len=len-1;}
    
            for(i=0;i<N+2;i++)
                matrix[righe+1][i]='.';
    
            for(i=0;i<len;i++){
                matrix[righe+1][i]=str[i];
            }
        righe++;}
    Potresti postare anche come hai inizializzato le variabili?
    In ogni caso mi sembra che tu ti stia complicando eccessivamente la vita!
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Sì, ecco!

    codice:
    #define N 50
    
        FILE* ff;
        int righe=0;
        char matrix [righe+1][N+1];
        char str[N+2]={0};
        int i=0, len=0;
    
        ff=fopen("cruciverba.txt", "r");

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Quote Originariamente inviata da wFree Visualizza il messaggio
    Sì, ecco!

    codice:
    #define N 50
    
        FILE* ff;
        int righe=0;
        char matrix [righe+1][N+1];
        char str[N+2]={0};
        int i=0, len=0;
    
        ff=fopen("cruciverba.txt", "r");
    codice:
    char matrix [righe+1][N+1];
    questa riga è sbagliata!

    In ogni caso è più semplice usare una memset e una strncpy
    codice:
    #include <stdio.h>
    #include <string.h>
    
    #define N 50
    
    int main()
    {
       FILE *fp;
       char buff[N];
       char mat[N][N];
       memset(mat, '.', N*N);
       int righe;
       
       fp = fopen("input.txt", "r");
       if( fp != NULL ){
          righe = 0;
          while ( fgets(buff, N, fp) != NULL ){
             if(buff[strlen(buff)-1] == '\n') buff[strlen(buff)-1] = '\0';
             strncpy(mat[righe], buff, strlen(buff));
             ++righe;
          }
          fclose(fp);
       }
       
       return 0;
    }
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Ok, ho capito grazie!
    Mi puoi solo spiegare perchè la riga in questione è sbagliata?
    codice:
    char matrix [righe+1][N+1];
    Non si può fare una cosa del genere? Perchè la utilizzo praticamente sempre

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Da C99 in poi sì, si può fare, ma non è questo il punto, il punto è che stai riservando spazio per per una matrice [1][N+2] e poi sicuramente leggerai più di 1 riga...
    Puoi risolvere chiedendo il numero delle righe all'inizio, sovra-allocando il numero delle righe (se sei sicuro che queste basteranno sempre) oppure attraverso l'allocazione dinamica della memoria.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Chiaro, grazie mille!

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Non c'è di che
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.