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

    [C] Conoscere dimensioni matrice su file

    Come da topic ho questo problema:
    ho una matrice di interi del tipo

    1 3 5 ...
    2 5 0 ...
    5 7 0 ...
    ...

    salvata su un file .txt di cui però non conosco le dimensioni (numero di righe e di colonne) a priori.
    Ho bisogno di conoscere queste dimensioni per fare delle operazioni....qualcuno può aiutarmi??

    Credo sia sufficiente conoscere un carattere di end-of-line per fare un confronto, ma ignoro quale sia a non riesco a trovarlo :master:
    Comunque credo qualcosa del genere:

    codice:
    ... for(i=0; i<filesize; i++)
             if(stream[i] == ????) colonne++ ...
    dove con stream intendo un buffer con tutti i caratteri del file contenente la matrice.

  2. #2
    Il carattere di End Of File è appunto EOF,
    il carattere di End Of Line non è EOL ma \n per unix e crtl-m + \n per dos.
    ASCII: \n = 13 ctrl-m = 10

    ... ma l'unico modo di conoscere le dimensioni (righe x colonne) 'a priori' è leggere il file (salvo proprietà particolari della tua matrice/dati)

    ? Puoi contare i '\n' gli spazi, ???, etc...
    ? Puoi leggere un carattere alla volta,
    ricavare le dimensioni e allocare la memoria.


    Stai solo attento a controllare che tutte le righe abbiano la stessa dimensione, etc..
    I produttori sostengono che la causa del prezzo elevato di Cd e Dvd è la pirateria. Una volta debellata la pirateria i prezzi duplicheranno in quanto non si potrà più piratare.

    W WinVista & Palladium & TCPA & Chip Fritz & MIPS 0.18um Made in China!

  3. #3
    Quindi, se ho ben capito, potrei trasformare il file in uno stream (array) di caratteri e confrontarlo con la sottostringa "\n" : appena la trovo significa che ho una nuova riga!

    Ad ogni modo voglio sottoporre un caso interressante...nel frattempo ho trovato nel Web un'altra soluzione:

    codice:
        FILE *fPtr;
        char *buffer;
        long filesize
    ...
        fPtr = fopen(file,"rb");
        fseek(fPtr,0,SEEK_END);
        filesize = ftell(fPtr);
        rewind(fPtr);
       
        buffer = (char *) malloc(filesize * sizeof(char));
    ...
        for(i=0; i<filesize ;i++){            //conta colonne della matrice
            if(buffer[i] == '\x09')
                mc++;
            if(buffer[i] == '\x0D'){
                mc++;
                break;
            }
        }
    ....
    funziona bene questo meotdo, ma non ho capito da dove vengano le stringhe '\x09' e '\x0D' !!!
    Si può generalizzarne l'uso su un qualsiasi file txt, oppure è un escamotage dell'autore del codice che li ha sapientemente messi a fine riga al momento della scrittura del file???

  4. #4

    asd

    nessun escamotage, se consulti la tabella ASCII il carattere di "nuova riga" è 13 o \n
    in html è
    , bla bla....

    Altrimenti come fa un interprete (es. notepad) a dire 'ora vado a capo' ?!

    L'unica differenza è che sotto MSDOS si usano 2 caratteri, appunto ctrl-M + \n ,
    sotto UNIX solo \n


    Bye
    I produttori sostengono che la causa del prezzo elevato di Cd e Dvd è la pirateria. Una volta debellata la pirateria i prezzi duplicheranno in quanto non si potrà più piratare.

    W WinVista & Palladium & TCPA & Chip Fritz & MIPS 0.18um Made in China!

  5. #5
    aaaaa ora ho capito!!

    Non c'ero arrivato al momento a capire che 0D è l'equivalente di 13 in esadecimale!

    Allora già che ci sono (e devo dire che la cosa mi ha incuriosito ) ti chiedo che significa la '\x' di '\x09' e '\x0D' perchè questa invece non l'ho capita....non bastava '0D' invece che '\x0D' ???

  6. #6
    \x Indica il formato esadecimale.

    di certo se vuoi scrivere un carattere strano ( tipo backspace ) non è detto che tu possa farlo e racchiuderlo tra apici, mentre se lo indichi come numero (es. 8) oppure come esadecimale ( \x08 ) oppure come binario ( 00000100 ) oppure come ottale, oppure come ???

    lo fai in tranquillità.

    char c = '\x08' ; // OK

    char c = (char) 8; // OK

    char c = '; // NON RIESCI A SCRIVERLO!!!
    I produttori sostengono che la causa del prezzo elevato di Cd e Dvd è la pirateria. Una volta debellata la pirateria i prezzi duplicheranno in quanto non si potrà più piratare.

    W WinVista & Palladium & TCPA & Chip Fritz & MIPS 0.18um Made in China!

  7. #7
    Ok! Tutto chiaro!

    Grazie mille per la delucidazione

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.