2013-06-28 32 views
1

我爲FCFS調度編寫了下面的代碼。 問題是此代碼編譯正常,但執行./a.out後,沒有顯示任何內容,程序卡住了。它甚至不打印在main()開頭的"Reading"printf聲明。問題是什麼?C程序卡住了,甚至沒有輸入主體

#include <stdio.h> 

struct process 
{ 

    int at; 
    int bt; 
    int wt; 
    int tt; 
    int rt; 
    char pid[5]; 

} p[5]; 

int i, j; 
int n = 0; 

void main() 
{ 
    printf("Reading"); 
    FILE *fp; 
    fp = fopen("in1.txt", "r"); 
    char sample; 
    if (fp != NULL) 
    { 
    sample = getc(fp); 
    while (sample != EOF); 
    { 
     if (sample == '\n') 
     n++; 
     sample = getc(fp); 
    } 
    fseek(fp, 0, 0); 
    for (i = 0; i < n; i++) 
    { 
     fscanf(fp, "%s %d %d", p[i].pid, &p[i].at, &p[i].bt); 
     p[i].wt = p[i].tt = 0; 
     p[i].rt = p[i].bt; 
    } 
    fclose(fp); 
    } 
    //sorta(); 
    printf("\nGantt Chart for FCFS\n"); 

    int t = 0; 
    int avgw = 0; 
    int avgt = 0; 
    printf("%d ", t); 
    for (i = 0; i < n; i++) 
    { 
    if (p[i].at > t) 
    { 
     printf("%d ", t); 
     t = p[i].at; 
    } 
    p[i].wt = t - p[i].at; 
    avgw = avgw + p[i].wt; 
    printf("%s ", p[i].pid); 
    p[i].tt = p[i].bt + p[i].wt; 
    avgt = avgt + p[i].tt; 
    t = t + p[i].bt; 
    printf("%d ", t); 
    printf("\navg waiting time = %d", avgw/n); 
    printf("\navg turn around time = %d", avgt/n); 
    } 
} 
+0

它是打印: 閱讀 甘特圖表先到先得什麼編譯你正在用嗎? – Lohit

+0

小備註:'p [5]'後來''從'0'運行到'n-1',可能超過'4',會導致緩衝區溢出,任何文件都有足夠的線。 –

+2

請在發佈之前縮進您的代碼。 – Lundin

回答

8

標準輸出是行緩衝。將「閱讀」更改爲「閱讀\ n」,您將看到它。

然後你在這裏有一個錯誤:

while (sample!=EOF); 

,雖然循環體僅僅是分號,而不是事後塊!如果條件成立,您的程序將陷入無限循環。

+0

明白了。但爲什麼不在這之後執行? –

+0

謝謝!現在就發現它! –

+0

另外'getc'返回一個int,而不是char。所以while循環永遠不會等於EOF,因爲EOF通常被定義爲一個> 255的整數常量。 – Lundin

1

待辦事項寫在頂部以下staements之後即void main

int t =0; 
int avgw=0; 
int avgt=0; 

並刪除;

while (sample!=EOF) 
+1

只有在使用逆行編譯器(不支持C99或更高版本的編譯器)時才需要移動聲明。 –