首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

求纠错:恕小弟我眼拙,实在看不出哪里有有关问题

2013-10-27 
求纠错:恕我眼拙,实在看不出哪里有问题下面这个代码作用是从两个文件中逐行分别读取数据,然后从读出的每一

求纠错:恕我眼拙,实在看不出哪里有问题
    下面这个代码作用是从两个文件中逐行分别读取数据,然后从读出的每一行数据中提取名字、分数、字数等信息。但用了几个编译器都通过编译了,但一运行就歇菜。我看了很久不知错在何处,debugging又还没有学,麻烦前辈们给诊断一下。万分感谢!

     注:其中注释掉的代码是之前的一个解法,能通过且能正常运行,但改成下面这个之后就不行了。



#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 64     //最大名字长度
#define SIZE 120   //最大人数

int main(void)
{
    FILE *fp1, *fp2, *fp3;
    char names_1[SIZE][MAX], names_2[SIZE][MAX];     //用以读取每一行参赛者信息
    int cnt_1 = 0, cnt_2 = 0, cnt_3 = 0, i,j;
    char nms_1[SIZE][MAX], nms_2[SIZE][MAX];        //用以装载参赛者的姓名
    float mks_1[SIZE], mks_2[SIZE];                 //用以装载参赛者获得的分数
    int wds_1[SIZE], wds_2[SIZE];                   //用以装载参赛者所写的字数
    //char * str, * nstr;
    //char ch;

    if((fp1 = fopen("marks1.txt", "r")) == NULL)
    {
        fprintf(stderr, "Error reading %s\n","marks1.txt");
        exit(1);
    }
    if((fp2 = fopen("marks2.txt", "r")) == NULL)
    {
        fprintf(stderr, "Error reading %s\n","marks2.txt");
        exit(2);
    }
    if((fp3 = fopen("results3.txt", "w")) == NULL)
    {
        fprintf(stderr, "Error writing %s\n","results3.txt");
        exit(3);
    }
    while(cnt_1 < SIZE && fgets(names_1[cnt_1],MAX, fp1) != NULL) //读取每一行信息
    {
        /*str = names_1[cnt_1];
        nstr = nms_1[cnt_1];
        while(*str)
        {
            if(*str == '\t')
                break;
            *nstr = *str;
            str++;
            nstr++;
        }
        *nstr = '\0';*/
        cnt_1++;
    }

    while(cnt_2 < SIZE && fgets(names_2[cnt_2],MAX, fp2) != NULL)
    {
        /* str = names_2[cnt_2];
        nstr = nms_2[cnt_2];
        while(*str)
        {
            if(*str == '\t')
                break;
            *nstr = *str;
            str++;
            nstr++;
        }
        *nstr = '\0'; */
        cnt_2++;
    }
    for(i = 0; i < cnt_1; i++)
    {
        if(sscanf(names_1[i], "%s%f%d",nms_1[i],mks_1[i],wds_1[i]) != 3)  //抽取信息
        {
            puts("\nError reading data");
            exit(0);
        }
        if(fprintf(fp3, "%s %.1f %d\n",nms_1[i],mks_1[i],wds_1[i]) != 3)  //写入文件
        {
            puts("\nError writing data");
            exit(0);
        }
    }
    for(i = 0; i < cnt_2; i++)


    {
        if(sscanf(names_2[i], "%s%f%d",nms_2[i],mks_2[i],wds_2[i]) != 3)
        {
            puts("\nError reading data");
            exit(0);
        }
        if(fprintf(fp3, "%s %.1f %d\n",nms_2[i],mks_2[i],wds_2[i]) != 3)
        {
            puts("\nError writing data");
            exit(0);
        }
    }
    /*fprintf(fp3, "Names found to exist in both file 1 and file 2:\n");
      for(i = 0; i < cnt_1; i++)
        for(j = 0; j < cnt_2; j++)
            if(strcmp(nms_1[i], nms_2[j]) == 0)
            {
                fprintf(fp3, "%s\n%s\n", names_1[i], names_2[j]);
                cnt_3++;
            } 
    fprintf(fp3, "Found: %d", cnt_3);*/
    fclose(fp1);
    fclose(fp2);
    fclose(fp2);

    return 0;
}



两个供读取的文件:
marks1.txt
张强 80 520
李赓 72 435
王齐 85 562
李丁 67 420

marks2.txt
刘超 83 320
陆进 78 450
葛非 78 540
伍凯 84 670
  C 数据 读取 文件
[解决办法]
sscanf(names_1[i], "%s%f%d",nms_1[i],mks_1[i],wds_1[i]);
这句话是错的
你怎么能这么写
[解决办法]
学debug,没你想得那么难。
[解决办法]
 if(sscanf(names_1[i], "%s%f%d",nms_1[i],&mks_1[i],&wds_1[i]) != 3)  //抽取信息

后面俩个是 int型的 这地方传的是地址 你直接把值传进去了
[解决办法]
调试程序,是必须掌握的基本技能!也是最基础的!

总要在接收新东西的时候学会新东西的,
[解决办法]
同意3楼
另外你fp3没关

热点排行