2016-06-10 44 views
0

這裏我的問題是計算輸入從文件中獲取的整數的無限數量的總和。該文件包含無限個整數在由space.And也是我需要顯示無效的輸入,如果整的那些輸入包含任何其它字符或symbols.I曾試圖驗證碼輸出以及 這裏是我的代碼....通過從C中的文件輸入輸入的無限整數的總和

void main() 
{ 
    int i=1,j,a[100000],total=0,r=0; 
    char discard,buffer[1024]; 
    FILE *fp; 
    char filename[100]; 
    scanf("%s",filename); 
    fp=fopen(filename,"r"); 
    do 
    { 
    fscanf(fp,"%1024s%c",buffer,&discard); 
    r+=sscanf(buffer,"%d",&a[i]); 
    total+=a[i++]; 
    } while(discard!='\n'); 
    if(r==i-1) 
    { 
    printf("\n%d",total); 
    } 
    else 
    printf("\n Invalid Input"); 
} 

的代碼執行但這裏的問題是代碼超出了我的時間限制。請幫助我,以便我可以得到更好的代碼

+0

顯示輸入文件的前3-4行。 –

+9

總結無限數量的整數總是需要無限的時間,因此違反了您的時間約束。 –

+1

@ChristianJonassen OP必須有一個驚人的硬盤,可以包含一個無限數量的行...... ;-) –

回答

1

您可以閱讀文件大塊,加速閱讀整數。對於提示,請查看此鏈接中的fread()示例(在鏈接頁面中搜索例如'sentinel'):How do I process a text file in C by chunks of lines?另外,請查看該答案的註釋,例如好主意,做的malloc,而不是堆棧分配的,也許使用二進制模式,約EOF等

0
  1. 獲取文件大小
  2. 通過的malloc
  3. 閱讀所有文件到分配的內存緩存動態分配內存緩衝區謹慎評論。
  4. 從內存緩衝區中進行其他操作。
+0

但內存沒有問題。如果我有內存問題,我可能會遇到一些其他的錯誤,這是我在之前的版本中遇到的 –

0

我不知道這是否會提高性能提升不少,但代碼的可讀性,我還刪除了使用堆棧緩衝區

void main() 
{ 
    int value = 0, total = 0, r = 0; 
    char discard; 
    FILE *fp; 
    char filename[100]; 
    scanf("%s",filename); 
    fp = fopen(filename,"r"); 
    do 
    { 
    r = fscanf(fp, "%d%c", &value, &discard); 
    if (r != 2 || (discard != ' ' && discard != '\n')) 
    { 
     printf("\n Invalid Input"); 
     return; 
    } 
    total += value; 
    } while(discard != '\n'); 
    printf("\n%d", total);  
} 

(請注意,這是未經測試,但我m自信)