2011-05-05 34 views
1

我指的是代码堵塞,因为大多数人都会理解我们拥有的输入文件的类型。 问题是 - 资格2010(甲鱼)代码堵塞练习 - 阅读问题

我面对我的程序的问题,它读取10000510000 5分别为两个整数从而改变整个输入到程序的第一个输入。这里是我的代码阅读输入:

#include<stdio.h> 

int main() 
{ 
    FILE *op=fopen("20101op.txt","w"); 
    FILE *ip=fopen("A-small-practice.in","rt"); 

    long int i,N,K,c; 
    fscanf(ip,"%ld ",&c); 

    printf("%d \t", c); 
    fscanf(ip,"%ld ",&N); 
    printf("%d \t", N); 
    fscanf(ip,"%ld ",&K); 
    printf("%d \t", K); 

    fclose(op); 
    fclose(ip); 

    return 0; 
} 

请帮我找出这个问题的原因!

回答

3

它看起来像你的编译器试图通过限制fscanf到16位来防止溢出。

什么编译器(和版本)以及您使用的操作系统是什么? 32或64位?

另外,fscanf会返回什么?

fscanf(ip,"%ld ",&c); 

这些行:)

int rv; 
rv = fscanf(ip,"%ld ",&c); 
printf("fscanf() returned: %d\n", rv); 

注:我不能在上面的反应(没有足够的声望)发表评论,但

(通过改变这一行测试此在某些编译器中使用't'来明确指定该文件是文本文件。

更新: 此函数应逐字符分析长整型。看到我关于使用这个的评论。

int fparselong(FILE * fp, long * ip) 
{ 
    int parsed = 0; 
    *ip = 0; 
    int c; 
    while((c = fgetc(fp)) != EOF) 
    { 
     // c is newline, return 0 if nothing has been parsed, 1 if something has 
     if(c == '\n'){ return parsed; } 
     // check for oob 
     if(c < '0' || c > '9'){ return -1; } 
     // Update ip 
     *ip = *ip * 10 + (c - '0'); 
     // Something has been parsed 
     parsed = 1; 
    } 
    // EOF received 
    return -2; 
} 

因此,而不是:

fscanf(ip,"%ld ",&c); 

你必须:

fparselong(ip, &c); 

同样,如果这个工程,不使用它,但找到另一个编译器。如果没有,它表明一个意外的字符出现在你的文件中。您可以使用hexdump您的输入文件或使用其他方法来确定这一点。

+0

+1注意16位限制:)哦..并欢迎来到堆栈溢出 – pmg 2011-05-05 09:17:24

+0

我使用代码块10.05赢得7 64位 fscanf()返回1 – 2011-05-06 06:55:14

+0

代码块是您的IDE,编译器是什么你在用吗? Microsoft Visual C++,MingW,GCC等? – jedwards 2011-05-06 16:03:10

0

您需要检查的返回值ALL输入库函数(fopenfscanf)。

另外,在第二个fopen的mode参数中有一个无效字符('t')。

+0

't '在某些编译器中用来明确指定该文件是一个** text **文件。 - [jedwards](http://stackoverflow.com/users/736937/jedwards) – pmg 2011-05-05 09:13:53

+1

@jedwards:好的,但没有为什么要重复冗余字符的信息?更重要的是:为什么编写不便携式的代码没有任何显着的增益? – pmg 2011-05-05 09:16:01

+0

(耶,我现在到处都可以评论! )@pmg,我完全同意,除了迷惑和(一旦发现它是为了什么)烦恼之外,我认为没有真正需要't' – jedwards 2011-05-05 14:19:18