代码堵塞练习 - 阅读问题

时间:2011-05-05 08:40:35

标签: c file-io

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

我在程序中面临的问题是它将100005的第一个输入读作10000 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;
}

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

2 个答案:

答案 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'来明确指定该文件是 text 文件。

<强>更新: 此函数应逐个字符地解析long。请参阅我对使用此内容的评论。

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输入文件或使用其他方法来确定这一点。

答案 1 :(得分:0)

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

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