2016-06-10 59 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自信)