2016-10-09 7 views
0

J'essaie de lire dans un fichier texte simulant la planification de la CPU, d'exécuter l'algorithme de planification et d'imprimer la sortie.Comment définir la taille de struct MAX aux lignes analysées à partir du fichier texte

à-dire le numéro d'identification de processus, l'heure d'arrivée, le temps de salve

1 0 3 
2 4 6 
... 

Comment attribuer la taille de la structure à créer avec la quantité de lignes balayées? Puis-je définir MAX comme le nombre de lignes analysées? Je suis capable de scanner le fichier d'entrée et de sortir le fichier, cependant, j'ai ma variable MAX pour la structure définie comme 10000. Le problème avec ceci est qu'il imprime dans le fichier la sortie correcte, mais imprime 0 0 0 jusqu'à 10000 lignes après les lignes d'entrée s'arrêtent. Voici mes fonctions.

#include<stdio.h> 
#include<stdlib.h> 
#define MAX 10000 



typedef struct 
{ 
    int pid; 
    int arrTime; 
    int burTime; 
    int finTime; 
    int waitTime; 
    int turnTime; 

}Process; 

Process pTable[MAX]; 


void readTable(char *fileName, Process pTable[MAX]) 
{ 

    int i; 
    FILE *fileIN = fopen(fileName, "r+"); 



    while(!feof(fileIN)) 
    { 
     fscanf(fileIN, "%d %d %d", &pTable[i].pid, &pTable[i].arrTime, &pTable[i].burTime); 
     i++; 
    } 



    fclose(fileIN); 

} 


void printTable(char *fileName, Process pTable[MAX]) 
{ 

    FILE *fileOUT = fopen(fileName,"w+"); 



    for(int i=0; i < MAX;i++) 
    { 
    fprintf(fileOUT, "%d %d %d\n",pTable[i].pid, pTable[i].arrTime, pTable[i].burTime); 
    } 


} 

int main(int argc, char **argv) 
{ 

    readTable(argv[1], pTable); 
    printTable(argv[2], pTable); 


} 

Voici la sortie que je donne pour le fichier d'entrée raccourci.

1 0 3 
2 4 6 
3 9 3 
4 12 8 
5 13 11 
6 18 19 
7 19 2 
8 23 4 
9 28 1 
10 31 3 
0 0 0 
0 0 0 
0 0 0 
0 0 0 
0 0 0 
0 0 0 
0 0 0 
0 0 0 
0 0 0 
0 0 0 
+0

En plus: s'il vous plaît voir [Pourquoi « while (feof (fichier)!) » Toujours tort?] (Http://stackoverflow.com/ questions/5431941/why-is-while-feof-file-always-wrong) –

+1

commencez par retourner 'i' à partir de' readtable'. Et vérifiez la valeur de retour 'fscanf': si c'est! = 3 alors vous avez atteint la fin du fichier. –

+0

Lorsque vous produisez la table, écrivez le nombre de lignes réellement lues, pas la capacité max. –

Répondre

1

Je comptais les lignes du fichier:

int lines = 0; 
while(!feof(fp)) 
{ 
    ch = fgetc(fp); 
    if(ch == '\n') 
    { 
    lines++; 
    } 
} 

Ensuite, utilisez malloc pour créer dynamiquement le struct sur le tas.

COMMENT FAIRE? Cette solution est de répondre à votre question spécifique concernant un tableau alloué dynamiquement.

#include<stdio.h> 
#include<stdlib.h> 

typedef struct PROCESS 
{ 
    int pid; 
    int arrTime; 
    int burTime; 
    int finTime; 
    int waitTime; 
    int turnTime; 

} process_t; 

process_t** pTable; 

int numLines = 0; 

int getNumLines(char* fileName) { 
    int lines = 0; 
    int ch; 
    FILE *fp = fopen(fileName, "r+"); 
    while(!feof(fp)) 
    { 
     ch = fgetc(fp); 
     if(ch == '\n') 
     { 
      lines++; 
     } 
    } 
    return lines; 
} 

void readTable(char *fileName) 
{ 
    /** Create process table **/ 
    pTable = malloc(sizeof *pTable); 
    numLines = getNumLines(fileName); 
    //TODO check numLines > 0 
    numLines++; //because we counted from 0! 

    int i; 
    for(i = 0; i < numLines; i++) { 
     pTable[i] = malloc(sizeof(*pTable)); 
     if(!pTable[i]) { 
      printf("Can not allocate memory for pTable!\r\n"); 
      exit(-1); 
     } 
    } 

    /** Do your stuff **/ 
    FILE *fileIN = fopen(fileName, "r+"); 
    i = 0; // 
    while(i < numLines) //feof is problematic! 
    { 
     fscanf(fileIN, "%d %d %d", &pTable[i]->pid, &pTable[i]->arrTime, 
       &pTable[i]->burTime); 
     i++; 
    } 

    fclose(fileIN); 
} 

void printTable(char *fileName) 
{ 
    FILE *fileOUT = fopen(fileName,"w+"); 

    //numLines must have been filled in a previous function 
    int i; 
    for(i=0; i < numLines;i++) 
    { 
     fprintf(fileOUT, "%d %d %d\n", pTable[i]->pid, pTable[i]->arrTime, 
       pTable[i]->burTime); 
    } 
} 

int main(int argc, char **argv) 
{ 

    readTable(argv[1]); 
    printTable(argv[2]); 

    return 0; 
} 

Quoi de mieux? Comme Mr. Fabre expliqué, vous êtes bien si vous maintenant votre valeur MAX est toujours plus grande que les lignes prévues dans le fichier d'entrée. Dans ce cas, il vous suffit de transmettre le nombre de lignes lues dans la fonction readTable dans la fonction printTable et de la remplacer par la valeur MAX pour laquelle vous exécutez la condition de boucle.

Voici la solution en utilisant un assez grand MAX:

#include<stdio.h> 
#include<stdlib.h> 

#define MAX 10000 //large enough number 

typedef struct 
{ 
    int pid; 
    int arrTime; 
    int burTime; 
    int finTime; 
    int waitTime; 
    int turnTime; 

}Process; 

Process pTable[MAX]; 

//returns number of lines read 
int readTable(char *fileName, Process pTable[MAX]) 
{ 
    int i = 0; //always init your variables or else you get garbage results 
    FILE *fileIN = fopen(fileName, "r+"); 
    while(!feof(fileIN)) 
    { 
     fscanf(fileIN, "%d %d %d", &pTable[i].pid, &pTable[i].arrTime, &pTable[i].burTime); 
     i++; 
    } 

    fclose(fileIN); 

    return i; //number of processed lines 
} 


void printTable(char *fileName, Process pTable[MAX], int numLines) 
{ 
    FILE *fileOUT = fopen(fileName,"w+"); 

    for(int i=0; i < numLines;i++) 
    { 
     fprintf(fileOUT, "%d %d %d\n",pTable[i].pid, 
     pTable[i].arrTime, pTable[i].burTime); 
    } 
} 

int main(int argc, char **argv) 
{ 
    int linesProcessed = readTable(argv[1], pTable); 
    printTable(argv[2], pTable, linesProcessed); 
} 
+0

Dans ma fonction readTable? –

+0

@BradVanBuren Vérifier ma mise à jour. –

+0

que faire si la valeur maximale varie? comme un autre nombre maximum pourrait être utilisé, je veux juste scanner et allouer assez de mémoire pour les lignes balayées. Je reçois un défaut de segmentation avec le code corrigé. –