2011-09-09 30 views
0

这里是我的代码:fscanf()函数把输入

FILE* fp,*check; 
fp=fopen("file.txt","r"); 
check=fp; 
char polyStr[10]; 
while(fgetc(check)!='\n') 
{ 
    fscanf(fp,"%s",polyStr); 
    puts(polyStr); 
    check=fp; 
} 
while(fgetc(check)!=EOF) 
{ 
    fscanf(fp,"%s",polyStr); 
    puts(polyStr); 
    check=fp; 
} 

现在,如果我file.txt是:

3,3, 4,4, 5,5 
4,1, 5,5, 12,2 

现在输出的是:

,3, 
4,4, 
5,5, 
,1, 
5,5, 
12,2, 

现在为什么是第一个字符两条线都没有被读取?

回答

4

fgetc呼叫吃的字符。

你应该读整线,fgets,然后与家人strtol解析它们。你不应该使用任何*scanf函数。

+0

如何防止呢?这是我用过的卡,而不是唯一的原因fp。如果检查增加,为什么fp也会增加? – Kraken

+0

好的,我可以使用fseek ..但为什么fp会在我做fgetc(检查)时发生变化? – Kraken

+1

'check'和'fp'是两个不同的指向*相同*'FILE'对象的指针。要获得两个独立的'FILE'对象,你必须调用'fopen'两次。但不要那样做,也不要使用'fseek'。用'fgets'读完整行。 – zwol

0

讲起输入数据的格式第一。如果您只有<coef>,<exp>而没有尾随逗号,那么您的列表似乎会更好地格式化。通过这种方式,你可以有一个很好的模式来匹配。所以,你可以这样做:

fscanf(filep, "%d,%d", &coef, &exp) 

得到的值。您应该检查fscanf的返回值以确保您正在阅读2个字段。因此,如果行的格式是一组下述“”(其中空白或者是一个空白或一个换行符,那么你将能够做到以下几点:

do { 
    fscanf(filep, "%d,%d", &coef, &exp); 
} while (fgetc(filep) != '\n'); 

该代码可以让你以获得线对,直到你吃完线为止,while条件将会吃掉空白线或换行符,你可以将它包装在另一个循环中,以便处理几条线。

请注意,我没有测试过这个代码,但是它的要点应该是清楚的。如果你有任何问题评论。

+0

如果我的输入是'3,2'等等,那么如果我的输入是'3,2'等,那么 'fscanf(fp,“%d,%d”,&cof,&exp)'make'cof = 3'和'exp = 2'。为什么不把逗号分开存储在'exp'中? – Kraken