• In diretta da GamesVillage.it
    • News
    • -
    • In Evidenza
    • -
    • Recensioni
    • -
    • RetroGaming
    • -
    • Anteprime
    • -
    • Video
    • -
    • Cinema

Visualizzazione risultati da 1 a 11 di 11

Discussione: Array di caratteri in c++

Cambio titolo
  1. #1

    Array di caratteri in c++

    Vi chiedo per l'ennesima volta un aiuto nel mio travagliato apprendimento del c++

    Vi spiego il mio problema. Ho questa funzione:

    Codice:
    char leggiFile(char chrFile[1024]) {
    
     FILE* fFile; 
     char chrLine[81];
     
    fFile = fopen(chrFile, "rt"); 
    
     if(fFile == NULL)
     {
      cout << "Impossibile aprire " << chrFile << endl;
      exit(0);
     }
    
     
     fgets(chrLine, 81, fFile);
     
     cout << chrLine << endl;
    
     fclose(fFile);
     
     return chrLine[81];
     
     }
    Devo recuperare il valore restituito della funzione. Ecco il codice:

    Codice:
    char riga[81];
    
    riga=leggiFile("nomefile.txt");
    cout << riga << endl;
    Ho provato qualsiasi cosa, mettendo anche gli asterischi dopo i vari char (quelli giusti ), però ho sempre ricevuto degli errori. Quando ho provato ad usare il tipo char*, in fase di compilazione non mi dava errore ma ricevevo invece un errore in fase di esecuzione.

    Cosa c'è di male nel mio codice?

    Per maggiore chiarezza, vi posto anche l'intero codice con il tipo char* (quello ke mi da l'errore in fase di esecuzione). Eccolo:

    Codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    char* leggiFile(char chrFile[1024]) {
    
     FILE* fFile; 
     char* chrLine;
    
     fFile = fopen(chrFile, "rt"); 
    
     if(fFile == NULL)
     {
      cout << "Impossibile aprire " << chrFile << endl;
      exit(0);
     }
    
     while(fgets(chrLine, 81, fFile) != NULL)
     {
      cout << chrLine << endl;
     }
     
     fgets(chrLine, 81, fFile);
     
     cout << chrLine << endl;
     
     fgets(chrLine, 81, fFile);
     
     cout << chrLine << endl;
     
     
     
     fclose(fFile);
     
     return chrLine;
     
     }
    
    int main()
    {
    
     char* riga;
     riga=leggiFile("nomefile.txt");
     
     cout << *riga << endl;
     
     cin.get();
    }
    Qualche idea?
    Ultima modifica di Nimrandir; 13-08-2004 alle 18:51:39

  2. #2
    Utente
    Registrato il
    10-02
    Messaggi
    2.367
    Non puoi assolutamente ritornare una'array di caratteri.
    Puoi ritornare il puntatore all'array ma non servirebbe.
    Le variabili dichiarate dentro una funzione sono in un area di memoria che si chiama stack. Quando la funzione termina non puoi più accedere a quei dati,perchè vengono sovrascritti.

    Nel tuo codice finale, devi sostituire nella funzione leggifile

    Codice:
    char * chrline;
    con
    Codice:
    char chrline[81];
    Così il tuo prog stamperà la riga nella funzione leggiFile, ma stamperà schifezze nel main, per i motivi che ti ho già spiegato.

    Codice:
    g++ -o prog porg.cpp
    *****.cpp: In function `char* leggiFile(char*)':
    *****.cpp:11: warning: address of local variable `chrLine' returned
    [email protected]:~$ prog
    stringa nel file
    
    stringa del file
    
    stringa nel file
    
    ��H���Or       @������4�����+@l����+�.�
    Come vedi anche il compilatore avverte che si sta facendo una cazzata.
    Ultima modifica di Yubei; 13-08-2004 alle 19:40:04

  3. #3
    Grazie mille, adesso ho capito. Basta dichiare la variabile ke contiene il contenuto del file fuori dalla funzione e rendere quindi la funzione void. Mi mancava la conoscenza della memoria di stack. Grazie ^^

  4. #4
    Utente
    Registrato il
    10-02
    Messaggi
    2.367
    Citazione Nimrandir
    Grazie mille, adesso ho capito. Basta dichiare la variabile ke contiene il contenuto del file fuori dalla funzione e rendere quindi la funzione void. Mi mancava la conoscenza della memoria di stack. Grazie ^^
    Volendo potresti dichiarare un buffer dinamico e ritornarne il puntatore.
    Documentati sulle funzioni malloc(), free() etc....

  5. #5
    Utente
    Registrato il
    12-02
    Località
    Venezia
    Messaggi
    110
    Un'alternativa e' quella di dichiarare l'array static, ad es.:
    Codice:
    #include <fstream>
    using namespace std;
    
    ...
    
    char *leggiFile(char *chrFile)
    {
        static char chrLine[81];
        ifstream file(chrFile);
        
        file.getline(chrLine, 81);
        
        return chrLine;
    }
    man is your friend

  6. #6
    Utente
    Registrato il
    10-02
    Messaggi
    2.367
    Citazione 3y34|v|31337
    Un'alternativa e' quella di dichiarare l'array static,
    Il che, è come dichirarlo globale.

  7. #7
    Abuso allora della vostra disponibilità x chiedervi un'altra cosa: devo recuperare un intero da un file e trattarlo come tale (cioè come intero, non come char). Come faccio?

  8. #8
    Utente L'avatar di Phoenix
    Registrato il
    10-02
    Località
    Midwich Street
    Messaggi
    6.699
    atoi (converte il carattere in intero)
    Codice:
    #include <iostream>
    using namespace std;
    
    int main(int argc, char* argv[]){
    
    cout << "\nNumero: " << argv[1] << endl;
    
    int numero = atoi(argv[1]);
    int sommato = 3 + numero;
    
    cout << "3 + " << numero << " uguale " << sommato << endl;
    
    return 0;
    }


    He who is not bold enough to be stared at from across the abyss
    is not bold enough to stare into it himself.

  9. #9
    Utente
    Registrato il
    10-02
    Messaggi
    2.367
    Tutte le funzioni atoi like sono nella stdlib.h
    Volendo cmq si può usare la sscanf.

  10. #10
    ISWT - Ad Vitam Aeternam L'avatar di red.devil
    Registrato il
    02-03
    Località
    London • UK
    Messaggi
    3.003
    Citazione Yubei
    Il che, è come dichirarlo globale.
    il chè è male! meglio passare per reference imho..

    Citazione Nimrandir
    Abuso allora della vostra disponibilità x chiedervi un'altra cosa: devo recuperare un intero da un file e trattarlo come tale (cioè come intero, non come char). Come faccio?
    dichiaralo int invece di char ...umh.. temo di non aver capito dove sia il problema..

  11. #11
    Utente
    Registrato il
    12-02
    Località
    Venezia
    Messaggi
    110
    Citazione Yubei
    Il che, è come dichirarlo globale.
    Non proprio, la visibilita' e' solo locale.
    man is your friend

Regole di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •