Apertura di un file, programmazione in linguaggio C

Stato
Discussione chiusa ad ulteriori risposte.

civil93

Nuovo Utente
9
0
Buongiorno, avrei bisogno del vostro aiuto per l'esecuzione di questo programma. Il testo è il seguente:
"Si scriva un programma in linguaggio C che legga il contenuto di un file
dopo averne ricevuto il nome da linea di comando. Il numero di righe del
file sia al massimo 80 e ciascuna riga del file contenga i seguenti campi,
ciascuno composto al massimo da 20 caratteri e privo di spazi
<materia> <nome prof> <cognome prof> <periodo> <crediti> <% superamento esame>
Il programma dovrà stampare a video:
a. il nome della materia che assegna più crediti in assoluto
b. per ciascun periodo didattico (considerandone al massimo 4), la
materia più difficile da superare
Il programma dovrà infine richiedere l’inserimento da tastiera di un
cognome di professore (massimo 20 caratteri) e stampare a video:
c. la somma dei crediti assegnati dalle materie che insegna
d. la media di superamento degli esami da lui tenuti."

Il codice da me realizzato è il seguente:
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 20

int main(int argc, char* argv[])
{
    FILE* fp;
    char mostcredits[N];
    char mostdifficult[4][N];
    char professore[N];
    int sommacreditiprof;
    float mediaprof=0;
    char stringa;
    float minsup1, minsup2, minsup3, minsup4;
    int maxcrediti;
    int numesami=0;
    int i;
    typedef struct professore
    {
        char nomeprof[N];
        char cognomeprof[N];
        char materia[N];
        int crediti;
        float sup;
        int periodo;
    } Professore;
    Professore prof[80];
    int righe;

    if(argc!=2)
        return -1;

    if((fopen(argv[1], "r"))==NULL)
        printf("Errore nell'apertura!\n");
    else
    {
        i=0;
        {
            sscanf(stringa, "%s %s %s %d %d %f", prof[i].materia, prof[i].nomeprof, prof[i].cognomeprof, &prof[i].periodo, &prof[i].crediti, &prof[i].sup);
            i++;
        }
            while((fgets(stringa, 86, fp))!=NULL);

        righe=i;

        maxcrediti=prof[0].crediti;
        minsup1=100;
        minsup2=100;
        minsup3=100;
        minsup4=100;

        for(i=1; i<righe; i++)
        {
            if(prof[i].crediti>maxcrediti)
                {
                    strcpy(mostcredits, prof[0].materia);
                    maxcrediti=prof[i].crediti;
                }
            switch(prof[i].periodo)
            {
            case 1:
                {
                    if(minsup1>prof[i].sup)
                    {
                        strcpy(mostdifficult[0], prof[i].materia);
                        minsup1=prof[i].sup;
                    }
                }
                break;
            case 2:
                 {
                    if(minsup2>prof[i].sup)
                    {
                        strcpy(mostdifficult[1], prof[i].materia);
                        minsup2=prof[i].sup;
                    }
                }
                break;
            case 3:
                 {
                    if(minsup3>prof[i].sup)
                    {
                        strcpy(mostdifficult[2], prof[i].materia);
                        minsup1=prof[i].sup;
                    }
                }
                break;
            case 4:
                 {
                    if(minsup4>prof[i].sup)
                    {
                        strcpy(mostdifficult[3], prof[i].materia);
                        minsup4=prof[i].sup;
                    }
                }
                break;
            }
        }

        printf("Materia con il max numero di crediti: %s\n", mostcredits);
        for(i=0; i<4; i++)
        {
            printf("Materia piu' difficile da superare del %d periodo: %s\n", i, mostdifficult[i]);
        }


    }

    printf("Inserisci il cognome di un professore:\n");
    scanf("%s", professore);

    for(i=0; i<righe; i++)
    {
        if((strcmp(professore, prof[i].cognomeprof))==0)
        {
            sommacreditiprof=sommacreditiprof + prof[i].crediti;
            numesami++;
            mediaprof=mediaprof+((prof[i].sup)/numesami);
        }

    }

    printf("Crediti del professore: %d\n", sommacreditiprof);
    printf("Media superamento prof: %f\n", mediaprof);

    fclose(fp);

    return 0;

}

Non riesco a capire perchè non funzioni, ho messo il file di testo da me creato nella cartella del programma quindi dovrebbe essere tutto a posto, ma non riesco proprio a capire cosa non vada. Qualcosa di errato nella linea da comando? Qualcuno mi aiuta? GRAZIE!!!
 

civil93

Nuovo Utente
9
0
guarda la libreria fstream che è usata per aprire file,scrivere ecc...

Ti spiego, purtroppo quella libreria non la conosco e non credo di poterla utilizzare perché non è nel programma dell'esame che devo fare! A me sembra tutto giusto come ho fatto, però non me lo apre proprio sto file e non capisco per quale motivo!
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Così ad occhio mi sa che non hai inizializzato il puntatore a file fp che usi per leggere il file.
 

signore del tempo

Utente Èlite
3,228
491
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
ArchLinux + KDE - Windows 10
Oltre a quanto giustamente sottolineato da 1nd33d, queste linee sono la maggiore probabile causa del malfunzionamento:
Codice:
sscanf(stringa, "%s %s %s %d %d %f", prof[i].materia, prof[i].nomeprof, prof[i].cognomeprof, &prof[i].periodo, &prof[i].crediti, &prof[i].sup);
Codice:
[COLOR=#333333]fgets(stringa, 86, fp))[/COLOR]

Dato che stai cercando di formattare/leggere una stringa in un char. (singolo carattere​)

Codice:
[COLOR=#333333]char stringa[/COLOR]

Cosa che sia GCC che clang ti avrebbero subito fatto notare:
Codice:
warning: passing argument 1 of ‘sscanf’ makes pointer from integer without a cast
             sscanf(stringa, "%s %s %s %d %d %f", prof[i].materia, prof[i].nomeprof, 
             ^
In file included from /usr/include/features.h:378:0,
                 from /usr/include/stdio.h:27,
                 from _f.c:1:
/usr/include/stdio.h:448:12: note: expected ‘const char * __restrict__’ but argument is of type ‘char’
 extern int __REDIRECT_NTH (sscanf, (const char *__restrict __s,
            ^
_f.c:44:20: warning: passing argument 1 of ‘fgets’ makes pointer from integer without a cast
             while((fgets(stringa, 86, fp))!=NULL);
                    ^
In file included from _f.c:1:0:
/usr/include/stdio.h:622:14: note: expected ‘char * __restrict__’ but argument is of type ‘char’
 extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
 
Ultima modifica:
Stato
Discussione chiusa ad ulteriori risposte.

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili