define   MAX   1000
#include   <stdio.h>
main()
{
char   name[MAX][20],s[20];
int   count[MAX],x,i,j,n;
FILE   *fp;for   (i=0;i <MAX;i++)  
 {
name[i][0]= '\0 ';count[i]=0; }fp=fopen( "d:\\temp\\name.txt ", "r ");while(!feof(fp))
{
fscanf(fp, "%s%d ",s,&x);
i=0;
while(i <MAX   &&   name[i][0]!= '\0 '   &&   strcmp(name[i],s))   i++;
if   (name[i][0]== '\0 ')   strcpy(name[i],s);
count[i]+=x;
}
fclose(fp);i=0;
while(i <MAX   &&   name[i][0]) 
 {printf( "%s\t%d\n ",name[i],count[i]);
i++;
}
}
将name.txt文本中的多行相同字符内容简化为一行,后面的数字进行统计,如:
aaa   1
bbb   2
ccc   3
aaa   2
ccc   2
bbb   1
结果:
aaa   3
bbb   4
ccc   5
bbb结果不正确,应该为bbb   3才对. 

解决方案 »

  1.   

    因为你的原文件的最后有一个空白字符(空格或'\n'), 这样, 读取完所有数据之后, fp并不到EOF, 因此会再次执行fscanf, 糟糕的是每次fscanf前你都没有初始化,因此如果fscanf没有取到内容,你并不知道,以为读到了。你可以在fscanf前加上初始化语句:
    s[0] = '\0';
    x = 0;这样就好了.所以说,通常要给变量初始化!
      

  2.   

    #define       MAX       1000 
    #include       <stdio.h> 
    #include <string.h>
    void main()
    {
    char name[MAX][20], s[20];
    int count[MAX],x,i;
    FILE *fp;
    for(i=0;i<MAX;i++)
    {
    name[i][0]='\0';
    count[i]=0;
    }

    fp=fopen("e:\\aa.txt", "r");

    while(!feof(fp))
    {
    fscanf(fp, "%s%d   ",s,&x);
    i=0;
    while(i <MAX && name[i][0]!= '\0' && strcmp(name[i],s))
    i++;
    if(name[i][0]=='\0')
    strcpy(name[i],s);
    count[i]+=x;
    }
    fclose(fp);

    i=0;
    while(i <MAX && name[i][0])
    {
    printf("%s\t%d\n",name[i],count[i]);
    i++;
    }

    输出结果:
    aaa       3 
    bbb       3 
    ccc       5楼主检查下赋值的时候是不是有不正确的地方,
    如name[i][0]=   '\0   ';
      

  3.   

    楼上的分析正确,fscanf没有读到内容,还是以前的内容,结果为4。赋初值即可