免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3794 | 回复: 9
打印 上一主题 下一主题

[C] [讨论]读取文件中的字符串并分析出不同类型的数据填入结构体 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-11 00:01 |只看该作者 |倒序浏览
2可用积分
/*下面这个简单程序功能是从硬盘上的文件中读入一个由6个空格隔开的7个字符段构成的一个完成的原始字符串,如: 12 Lao Wang 20 13 15 22,然后对这个字符串加以分析后提取数据.要提取的数据分别为整数 12,字符串 Lao,字符串 Wang,整数 20,整数 13,整数 15,以及整数 22.假定编程者已知该原始字符串的以上这个格式.然后将这些解析出来的数据填入相应的结构体数组的数据元素中去,最后打印填充好的结构体数组.但程序中有问题造成了数据填出有误.请指出以下本人程序代码中的错误,谢谢!*/

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

#define ARRSIZE 18
#define NAMELEN 31
#define ARRMAX  10
#define STRMAX  91
#define FILENAM 81

typedef struct{

    int playernumber;
    char fisrtname[NAMELEN];
    char lastname[NAMELEN];
    int otab;
    int noh;
    int walks;
    int rbis;
}PLAYERINFO;

int strtoi(const char * );

int main(void){

    PLAYERINFO infodat[ARRSIZE];
    FILE * fp;
    char filename[FILENAM],getdat[ARRSIZE][STRMAX];
    int plyrnm[ARRSIZE],otab[ARRSIZE],noh[ARRSIZE],walks[ARRSIZE],rbis[ARRSIZE];
    char firstname[ARRSIZE][NAMELEN],lastname[ARRSIZE][NAMELEN];
    char plyrnmi[ARRMAX],firstnamei[NAMELEN],lastnamei[NAMELEN],otabi[ARRMAX];
    char nohi[ARRMAX],walksi[ARRMAX],rbisi[ARRMAX];
    int j = 0,k = 0,p = 0,cnt = 0;

    printf("\nPlease enter the file name: ";
    gets(filename);
    if((fp = fopen(filename,"r") == NULL){

        puts("\nError opening file. Exiting...";
        exit(EXIT_FAILURE);
    }

    for(j = 0; j < ARRSIZE; j++){

        infodat[j].playernumber = 0;
        infodat[j].otab = 0;
        infodat[j].noh = 0;
        infodat[j].walks = 0;
        infodat[j].rbis = 0;
    }

    j= 0;
    while(j < ARRSIZE && fgets(getdat[j],STRMAX,fp) != NULL){
        j++;
        cnt++;
    }

    for(j = 0; j < cnt; j++){

        while(getdat[j][p] != EOF){

            if(getdat[j][p] == ' ')
                break;

            plyrnmi[k] = getdat[j][p];
            k++;
            p++;
        }
        plyrnmi[k] = '\0';
        plyrnm[j] = strtoi(plyrnmi);
        p++;

        k = 0;
        while(getdat[j][p] != EOF){

            if(getdat[j][p] == ' ')
                break;

            firstnamei[k] = getdat[j][p];
            k++;
            p++;
        }
        firstnamei[k] = '\0';
        strcpy(firstname[j],firstnamei);
        p++;

        k = 0;
        while(getdat[j][p] != EOF){

            if(getdat[j][p] == ' ')
                break;

            lastnamei[k] = getdat[j][p];
            k++;
            p++;
        }
        lastnamei[k] = '\0';
        strcpy(lastname[j],lastnamei);
        p++;

        k = 0;
        while(getdat[j][p] != EOF){

            if(getdat[j][p] == ' ')
                break;

            otabi[k] = getdat[j][p];
            k++;
            p++;
        }
        otabi[k] = '\0';
        otab[j] = strtoi(otabi);
        p++;

        k = 0;
        while(getdat[j][p] != EOF){

            if(getdat[j][p] == ' ')
                break;

            nohi[k] = getdat[j][p];
            k++;
            p++;
        }
        nohi[k] = '\0';
        noh[j] = strtoi(nohi);
        p++;

        k = 0;
        while(getdat[j][p] != EOF){

            if(getdat[j][p] == ' ')
                break;

            walksi[k] = getdat[j][p];
            k++;
            p++;
        }
        walksi[k] = '\0';
        walks[j] = strtoi(walksi);
        p++;

        k = 0;
        while(getdat[j][p] != EOF){

            if(getdat[j][p] == ' ')
                break;

            rbisi[k] = getdat[j][p];
            k++;
            p++;
        }
        rbisi[k] = '\0';
        rbis[j] = strtoi(rbisi);
    }
    for(j = 0; j < cnt; j++){

        infodat[j].playernumber = plyrnm[j];
        strcpy(infodat[j].fisrtname,firstname[j]);
        strcpy(infodat[j].lastname,lastname[j]);
        infodat[j].otab = otab[j];
        infodat[j].noh = noh[j];
        infodat[j].walks = walks[j];
        infodat[j].rbis = rbis[j];
        printf("\n%d %s %s %d %d %d %d",infodat[j].playernumber,infodat[j].fisrtname,
                                        infodat[j].lastname,infodat[j].otab,
                                        infodat[j].noh,infodat[j].walks,infodat[j].rbis);
    }
    return 0;
}

int strtoi(const char * ar){

    int j;
    int sum = 0;

    while(* ar){

        if(* ar < '0' || * ar > '9'){
            return -1;
            break;
        }
        sum += (int)(* ar - 4 * decpow(strlen(ar));
        ar++;
    }
    return sum;
}

int decpow(int n){

    int product = 1;
    int i;

    if(n == 1)
        return product;
    else{
        for(i = 1; i < n; i++)

            product *= 10;

        return product;
    }
}

/*程序调试情况,假定硬盘上文本文件名为 "dat.txt",其中的数据如下:

0 Michael May 5 3 0 2
1 Sharon Lee 6 2 2 1
3 Jersy May 7 4 2 0 1
4 Jessie Joybat 5 2 1 1
5 John Bush 8 2 0 1
6 Bill Clinton 8 5 2 1
7 Tesson Kart 7 3 2 0

程序运行情况如下:

Please enter the file name: dat.txt

0 Michael ? 5 3 0 -1
0 = 0 0 0 0
0 Jessie  5 2 1 -1
0 Bill Clinton 8 5 2 -1
0   0 0 -1 -1
0   0 0 0 -1
0 !"#$%&'x=  0 0 0 0

*/

最佳答案

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
2 [报告]
发表于 2008-05-11 00:01 |只看该作者

  1. #include <stdio.h>
  2. #include <ctype.h>

  3. #define ALEN(a) (sizeof(a)/sizeof((a)[0]))

  4. #define NAMELEN 31

  5. typedef struct s_playerinfo{
  6.     int playernumber;
  7.     char fisrtname[NAMELEN];
  8.     char lastname[NAMELEN];
  9.     int otab;
  10.     int noh;
  11.     int walks;
  12.     int rbis;
  13. }PLAYERINFO;

  14. typedef int (*GET_FILE_ELEMENT)(FILE *fp, PLAYERINFO *pi);

  15. int skip_file_space(FILE *fp) {
  16.         int c;

  17.         c = fgetc(fp);
  18.         if (c != EOF) {
  19.                 if (isspace(c)) {
  20.                         do {
  21.                                 if (!isspace(c)) {
  22.                                         ungetc(c, fp);
  23.                                         break;
  24.                                 }
  25.                         }while ((c = fgetc(fp)) != EOF);
  26.                         return 0;
  27.                 }
  28.                 ungetc(c, fp);
  29.         }
  30.         return -1;
  31. }

  32. int skip_file_to_return(FILE *fp) {
  33.         int c;

  34.         while ((c = fgetc(fp)) != EOF) {
  35.                 if (c == '\n' || c == '\r') {
  36.                         return 0;
  37.                 }
  38.         }
  39.         return 0;
  40. }

  41. int get_file_int(FILE *fp, int *reti) {
  42.         int c;
  43.         int i;

  44.         c = fgetc(fp);
  45.         if (c != EOF) {
  46.                 if (isdigit(c)) {
  47.                         i = 0;
  48.                         do {
  49.                                 if (!isdigit(c)) {
  50.                                         break;
  51.                                 }
  52.                                 i = i * 10 + c - '0';
  53.                         }while ((c = fgetc(fp)) != EOF);
  54.                         ungetc(c, fp);
  55.                         *reti = i;
  56.                         return 0;
  57.                 }
  58.                 ungetc(c, fp);
  59.         }
  60.         return -1;
  61. }

  62. int get_file_text(FILE *fp, char *buf, int buf_len) {
  63.         int c;

  64.         if (buf_len > 0) {
  65.                 c = fgetc(fp);
  66.                 if (c != EOF) {
  67.                         if (!isspace(c)) {
  68.                                 do {
  69.                                         if (buf_len <= 1 || isspace(c)) {
  70.                                                 break;
  71.                                         }
  72.                                         *buf++ = c;
  73.                                         buf_len--;
  74.                                 }while ((c = fgetc(fp)) != EOF);
  75.                                 ungetc(c, fp);
  76.                                 *buf = '\0';
  77.                                 return 0;
  78.                         }
  79.                         ungetc(c, fp);
  80.                 }
  81.         }
  82.         return -1;
  83. }

  84. int get_file_line(FILE *fp, GET_FILE_ELEMENT *ops, int n_ops, PLAYERINFO *pi) {
  85.         int i;
  86.         int retval;

  87.         for (i = 0; i < n_ops; i++) {
  88.                 retval = (*ops[i])(fp, pi);
  89.                 if (retval != 0) {
  90.                         return retval;
  91.                 }
  92.         }
  93.         return 0;
  94. }

  95. int get_file_space(FILE *fp, PLAYERINFO *pi) {
  96.         return skip_file_space(fp);
  97. }

  98. int get_file_return(FILE *fp, PLAYERINFO *pi) {
  99.         return skip_file_to_return(fp);
  100. }

  101. int get_file_playernumber(FILE *fp, PLAYERINFO *pi) {
  102.         return get_file_int(fp, &pi->playernumber);
  103. }

  104. int get_file_firstname(FILE *fp, PLAYERINFO *pi) {
  105.         return get_file_text(fp, pi->fisrtname, NAMELEN);
  106. }

  107. int get_file_lastname(FILE *fp, PLAYERINFO *pi) {
  108.         return get_file_text(fp, pi->lastname, NAMELEN);
  109. }

  110. int get_file_otab(FILE *fp, PLAYERINFO *pi) {
  111.         return get_file_int(fp, &pi->otab);
  112. }

  113. int get_file_noh(FILE *fp, PLAYERINFO *pi) {
  114.         return get_file_int(fp, &pi->noh);
  115. }

  116. int get_file_walks(FILE *fp, PLAYERINFO *pi) {
  117.         return get_file_int(fp, &pi->walks);
  118. }

  119. int get_file_rbis(FILE *fp, PLAYERINFO *pi) {
  120.         return get_file_int(fp, &pi->rbis);
  121. }

  122. int get_file_playerinfo(FILE *fp, PLAYERINFO *pi) {
  123.         static GET_FILE_ELEMENT ops[] = {
  124.                 get_file_playernumber,
  125.                 get_file_space,
  126.                 get_file_firstname,
  127.                 get_file_space,
  128.                 get_file_lastname,
  129.                 get_file_space,
  130.                 get_file_otab,
  131.                 get_file_space,
  132.                 get_file_noh,
  133.                 get_file_space,
  134.                 get_file_walks,
  135.                 get_file_space,
  136.                 get_file_rbis,
  137.                 get_file_return,
  138.         };
  139.         PLAYERINFO tmp_pi;
  140.         int retval;

  141.         retval = get_file_line(fp, ops, ALEN(ops), &tmp_pi);
  142.         if (retval == 0) {
  143.                 *pi = tmp_pi;
  144.                 return 0;
  145.         }
  146.         return retval;
  147. }

  148. int main(void) {
  149.         FILE *fp;
  150.         PLAYERINFO pi;

  151.         fp = fopen("test.txt", "r");
  152.         if (fp != NULL) {
  153.                 while (get_file_playerinfo(fp, &pi) == 0) {
  154.                         printf("%d %s %s %d %d %d %d\n",pi.playernumber,pi.fisrtname,
  155.                                                                                         pi.lastname,pi.otab,
  156.                                                                                         pi.noh,pi.walks,pi.rbis);
  157.                 }
  158.                 fclose(fp);
  159.                 return 0;
  160.         }
  161.         return -1;
  162. }
复制代码

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
3 [报告]
发表于 2008-05-11 15:29 |只看该作者

  1. #include <stdio.h>
  2. #include <ctype.h>

  3. #define NAMELEN 31

  4. typedef struct s_playerinfo{
  5.     int playernumber;
  6.     char fisrtname[NAMELEN];
  7.     char lastname[NAMELEN];
  8.     int otab;
  9.     int noh;
  10.     int walks;
  11.     int rbis;
  12. }PLAYERINFO;

  13. int skip_file_space(FILE *fp) {
  14.         int c;

  15.         if (isspace(c = fgetc(fp))) {
  16.                 while ((c = fgetc(fp)) != EOF) {
  17.                         if (!isspace(c)) {
  18.                                 ungetc(c, fp);
  19.                                 return 0;
  20.                         }
  21.                 }
  22.         }
  23.         return -1;
  24. }

  25. int skip_file_to_return(FILE *fp) {
  26.         int c;

  27.         while ((c = fgetc(fp)) != EOF) {
  28.                 if (c == '\n' || c == '\r') {
  29.                         return 0;
  30.                 }
  31.         }
  32.         return -1;
  33. }

  34. int get_file_int(FILE *fp, int *reti) {
  35.         int c;
  36.         int i;

  37.         if (isdigit(c = fgetc(fp))) {
  38.                 ungetc(c, fp);
  39.                 i = 0;
  40.                 while ((c = fgetc(fp)) != EOF) {
  41.                         if (!isdigit(c)) {
  42.                                 break;
  43.                         }
  44.                         i = i * 10 + c - '0';
  45.                 }
  46.                 ungetc(c, fp);
  47.                 *reti = i;
  48.                 return 0;
  49.         }
  50.         return -1;
  51. }

  52. int get_file_text(FILE *fp, char *buf, int buf_len) {
  53.         int c;

  54.         if (buf_len > 0) {
  55.                 if (!isspace(c = fgetc(fp))) {
  56.                         ungetc(c, fp);
  57.                         while ((c = fgetc(fp)) != EOF) {
  58.                                 if (buf_len <= 0 || isspace(c)) {
  59.                                         break;
  60.                                 }
  61.                                 *buf++ = c;
  62.                                 buf_len--;
  63.                         }
  64.                         ungetc(c, fp);
  65.                         *buf = '\0';
  66.                         return 0;
  67.                 }
  68.         }
  69.         return -1;
  70. }

  71. int get_file_playerinfo(FILE *fp, PLAYERINFO *pi) {
  72.         PLAYERINFO tmp_pi;

  73.         if (get_file_int(fp, &tmp_pi.playernumber) == 0) {
  74.                 if (skip_file_space(fp) == 0) {
  75.                         if (get_file_text(fp, tmp_pi.fisrtname, NAMELEN) == 0) {
  76.                                 if (skip_file_space(fp) == 0) {
  77.                                         if (get_file_text(fp, tmp_pi.lastname, NAMELEN) == 0) {
  78.                                                 if (skip_file_space(fp) == 0) {
  79.                                                         if (get_file_int(fp, &tmp_pi.otab) == 0) {
  80.                                                                 if (skip_file_space(fp) == 0) {
  81.                                                                         if (get_file_int(fp, &tmp_pi.noh) == 0) {
  82.                                                                                 if (skip_file_space(fp) == 0) {
  83.                                                                                         if (get_file_int(fp, &tmp_pi.walks) == 0) {
  84.                                                                                                 if (skip_file_space(fp) == 0) {
  85.                                                                                                         if (get_file_int(fp, &tmp_pi.rbis) == 0) {
  86.                                                                                                                 skip_file_to_return(fp);
  87.                                                                                                                 *pi = tmp_pi;
  88.                                                                                                                 return 0;
  89.                                                                                                         }
  90.                                                                                                 }
  91.                                                                                         }
  92.                                                                                 }
  93.                                                                         }
  94.                                                                 }
  95.                                                         }
  96.                                                 }
  97.                                         }
  98.                                 }
  99.                         }
  100.                 }
  101.         }
  102.         return -1;
  103. }

  104. int main(void) {
  105.         FILE *fp;
  106.         PLAYERINFO pi;

  107.         fp = fopen("test.txt", "r");
  108.         if (fp != NULL) {
  109.                 while (get_file_playerinfo(fp, &pi) == 0) {
  110.                         printf("%d %s %s %d %d %d %d\n",pi.playernumber,pi.fisrtname,
  111.                                                                                         pi.lastname,pi.otab,
  112.                                                                                         pi.noh,pi.walks,pi.rbis);
  113.                 }
  114.                 fclose(fp);
  115.                 return 0;
  116.         }
  117.         return -1;
  118. }
复制代码

[ 本帖最后由 cobras 于 2008-5-11 15:37 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2008-05-11 18:13 |只看该作者

请问cobras以及其他版友

谢谢cobra提供的解题代码!你的代码很好地利用了自构造函数,很有效率.不过,我想我的代码如果能够经过某些修改也能达到同样的效果就好了,请问哪些地方还需要修改的呢?谢谢各位!

论坛徽章:
38
2017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:2720周年集字徽章-周	
日期:2022-01-13 15:12:33
5 [报告]
发表于 2008-05-11 19:17 |只看该作者
原帖由 cobras 于 2008-5-11 15:29 发表

#include
#include

#define NAMELEN 31

typedef struct s_playerinfo{
    int playernumber;
    char fisrtname[NAMELEN];
    char lastname[NAMELEN];
    int otab;
    int noh;
    in ...


这个代码太开眼界了

论坛徽章:
0
6 [报告]
发表于 2008-05-12 05:01 |只看该作者
嵌套起来的if语句有够漂亮的 o(∩_∩)o... 2楼

论坛徽章:
0
7 [报告]
发表于 2008-05-12 18:06 |只看该作者

请再赐教!

谢谢cobras以及其他版友!但cobras的两个解题代码没有加注必要的代码注释因而我对其解题思路还是不甚了了,所以请再不吝赐教!而且我的代码的思路其问题出在哪里也请一并指出,谢谢!

论坛徽章:
0
8 [报告]
发表于 2012-03-08 21:29 |只看该作者
sum += (int)(* ar - 4 * decpow(strlen(ar));
这句4后面的表情符本该是什么啊

论坛徽章:
0
9 [报告]
发表于 2012-03-08 21:30 |只看该作者
")

论坛徽章:
0
10 [报告]
发表于 2012-03-09 09:05 |只看该作者
如果文件不是很大不是有sscanf可以用吗??
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP