2016-10-09 2 views
0

CPUスケジューリングをシミュレートし、スケジューリングアルゴリズムを実行し、出力をプリントアウトするテキストファイルを読み込もうとしています。テキストファイルからスキャンした行にstruct MAXサイズを定義する方法

すなわちプロセスID番号、到着時間、バースト時間構造体の大きさが走査線の量を使用して作成する

1 0 3 
2 4 6 
... 

がどのように割り当てることができますか?スキャンするライン数をMAXと定義できますか?私は入力ファイルをスキャンしてファイルを出力することができますが、10000として定義された構造体のMAX変数を持っています。この問題はファイルに正しい出力を出力しますが、10000まで0 0 0を出力することです入力行の後の行は停止します。ここに私の機能があります。

#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); 


} 

ここでは短縮入力ファイルの出力を示します。

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

脇:ここ

が十分な大きMAXを使用したソリューションである[なぜ常に間違っている「(!feofを(ファイル))しながら、」ある?]を参照してください(http://stackoverflow.com/質問/ 5431941/why-is-feof-file-always-wrong) –

+1

は、 'readtable'から' i'を返すことから始まります。 'fscanf'の戻り値をチェックしてください:!= 3ならば、ファイルの終わりに達しました。 –

+0

テーブルを出力するときは、最大容量ではなく、実際に読み取られた行数を書き込んでください。 –

答えて

1

私は、ファイルの行数をカウントします:

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

次に動的ヒープ上に構造体を作成するためにmallocを使用しています。

どのようにすればよいですか? この解決策は、動的に割り当てられた配列に関する特定の質問に答えることです。

#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; 
} 

何が最適ですか? Mr. Fabreが説明されているので、MAX値が常に入力ファイルの予想される行よりも大きい場合は問題ありません。その場合、readTable関数で読み取られた行数をprintTable関数に渡し、ループ条件を実行する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

私のreadTable関数では? –

+0

@BradVanBuren更新を確認してください。 –

+0

最大値が変わるとどうなりますか?別の最大数のように使用することができます、私はスキャンし、スキャンされた行のために十分なメモリを割り当てたいです。修正されたコードでセグメント化エラーが発生しました。 –

関連する問題