2013-07-22 129 views
0

我已閱讀本網站上的幾個問題,並設法編寫下面從代碼中讀取數據的代碼(以下代碼顯示)。問題在於代碼在do {...} while段中處於無限循環,表明它不能「識別」換行符。我不知道該怎麼做。另外,當我從命令行傳遞文件名進行讀取時,它會崩潰。有人可以幫忙嗎?從文本文件中讀取時的無限循環

輸入文件格式:

1 3 

3 

3 1 23588769 1 2 1 4 

4 9 4788939 3 2 1 2 2 4 5 5 2 3 3 1 4 

3 5 17215766 5 2 1 1 4 5 5 4 

代碼:

int main (int argc, char *argv[]) 
{ 
FILE *fp = NULL; 
if (argc == 1) 
{ 
    fp = stdin; 
} 
else 
{ 
    fp = fopen(argv[1], "r") ; 
} 
fp = fopen(argv[1], "r") ; 
if (fp == NULL) exit(2); 
for(i=0; i<42; i++) 
    KEYS_I_HAVE[i]=0; 

    fscanf(fp,"%d",&num_start_keys); 
fscanf(fp, "%d",&doors); 
KEYS_FOR_DOORS = (int*)malloc(doors*sizeof(int)); 
POINTS = (int*)malloc(doors*sizeof(int)); 

for(i=0; i<doors; i++) 
      { 
       KEYS_FOR_DOORS[i]=0; 
       POINTS[i]=0; 
      } 
MAP = malloc(doors*sizeof(int)); 

for(i=0; i<43; i++) 
       MAP[i] = malloc(43*sizeof(int)); 
for(i=0; i<doors; i++) 
      { 
       for (j=0; j<43; j++) 
        MAP[i][j] = 0; 
      } 


for(i=0; i<(doors+1); i++)   
      { 
       j=0; 
       if(i==0) 
        { 
         do 
          { 
           fscanf(fp,"%d",&temp); 
           printf("%d",temp); 
           KEYS_I_HAVE[temp]++; 
           a=fgetc(fp); 
          }while(a != '\n'); 
        } 
       else 
        { 
         do 
          { 
           fscanf(fp,"%d",&temp); 

           if (j==0) 
             sum += temp; 
           else 
            { 
             if (j==1) 
              KEYS_FOR_DOORS[i-1] = temp; 
             else 
              { 
               if(j==2) 
                POINTS[i-1]=temp; 
               else 

                MAP[i-1][temp]++; 
              } 
            } 
           a=fgetc(fp); 
           j++; 
           if (feof(fp)) break; 
          }while(a != '\n' ); 
        } 
      } 
fclose(fp); 
+1

兩個直接的問題:如果你不提供參數的程序,它仍試圖打開'的argv [ 1]'。如果你使用'stdin'作爲輸入,你仍然在程序結束時關閉文件。 –

+1

除此之外,我建議你使用'while(fgets(...)!= NULL)'來讀取行,然後解析行的內容。 –

+0

如果您有時間,請修復代碼段的格式,以便Stackoverflow上的內容繼續保持高質量。謝謝。 – Sabuncu

回答

0

簡單的解決方法是改變所有你a != '\n'a != EOF && a != '\n'還有許多其他的修復也應該進行,但應該解決問題。

作爲一般規則,你應該做while((a=fgetc(fp))!=EOF) {...}而不是do/while,因爲它有助於避免這種特殊的錯誤,而且更具慣用性。另外,請勿按原樣使用feof。如果feof的目的是爲了區分是否已達到數據的末尾並遇到讀取錯誤。由於您沒有在代碼中處理讀取錯誤,因此調用feof沒有意義。 (請注意,如果確實遇到讀取錯誤,feof將始終返回false,並且您將再次陷入無限循環。)

+0

這個想法是我用「a!= EOF && a!= '\ n'「,它不起作用,它立即停止循環,並feof工作沒有它它永遠不會結束......這是相當混亂 –

0

我推薦使用fgets,然後解析每一行。例如:

char line[SOME_MAX_SIZE]; 

while (fgets(line, SOME_MAX_SIZE, fp)) 
{ 
    some_parse_function(line); 
} 

爲了您的標題行它會是這樣的:

if (fgets(line, SOME_MAX_SIZE, fp)) 
{ 
    sscanf(line, "%d %d\n", &num_start_keys, &doors); 
} 
相關問題