我指的是代码堵塞,因为大多数人都会理解我们的输入文件类型。 问题是 - 资格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;
}
请帮我找出这个问题的原因!
答案 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)
您需要检查所有输入库函数(fopen
,fscanf
)的返回值。
此外,第二个fopen的mode参数中存在无效字符('t'
)。