C语言文件读写实践(三)
上一次读写name.data文件,只读取了英文名字,并对英文名字做了处理,这次将英文中文名字同时读取并写入目标文本文件!!!
只读取英文名和中文译名
- 关键:中文用UTF8编码,每个中文字符占用3个字节,首字节大于等于0xE0,遇到这种情况,就再读两个字节,将一个完整中文字符读出来!!!
- 将括号中的昵称去掉,从(开始,到)结束!!!
程序代码如下:
/* filename: fi.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>/**/
void
op_file_v2 (void)
{char buf[128] = {0};int tmp = 1;FILE *fpi, *fpo;fpi = fopen ("name.data", "r");fpo = fopen ("name.dat", "w+");do{int i = 0, flag = 0;unsigned char t = 0;tmp = fscanf (fpi, "%s", buf);while (i < 128){unsigned char c = buf[i];if (c == '\0') break;else if (c == '(') flag = 1;else if (c == ')') t = c;if (flag == 0){if (c >= 0xE0){if (buf[i-1] >= 'a' && buf[i-1] <= 'z')fputc (' ', fpo);fputc (c, fpo); i++;fputc (buf[i], fpo); i++;fputc (buf[i], fpo);}else if (c >= 'A' && c <= 'Z'){unsigned char a = buf[i-1];if (a != '/') fputc ('\n', fpo);fputc (c, fpo);}else if (c >= 'a' && c <= 'z')fputc (c, fpo);else if (c == '/')fputc (c, fpo);}if (t == ')'){ flag == 0; t = 0; }i++;}if (tmp == EOF) break;memset (buf, 0, 128);}while (1);fclose (fpo);fclose (fpi);
}/**/
int
main (int argc, char *argv[])
{op_file_v2 (); //Linda 琳达lindsay 琳赛//Linda 琳达//Lindsay 琳赛return 0;
}
/* --(*.^.*)-- */
编译运行,顺利通过,生成name.dat文件
gwsong@ubuntu:~/works/xdn/foo$ gcc fi.c -o fi
gwsong@ubuntu:~/works/xdn/foo$ ./fi
- 查看name.dat文件,内容格式如下:
Aaron 亚伦
Abel 亚伯
Abraham 亚伯拉罕
Adam 亚当
Adrian 艾德里安
......
- 发现有一行「Linda 琳达lindsay 琳赛」,将其改为两行:
Linda 琳达
Lindsay 琳赛
- 发现有一行「Nathaniel」,加上中文名字:
Nathaniel 纳撒尼尔
达到预期,下一个操作,在名字前面加一列性别标识
- 性别Gender,男Male/女Female,分别用字母M和F来代替!!!
- 文件从248行开始是女名,之前是男名,简单计数,以是否大于等于248为条件添加即可。
程序代码如下:
/* filename: fj.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>/**/
void
opfile_va (void)
{char c;unsigned int count = 0;FILE *fpi, *fpo;fpi = fopen ("name.dat", "r");fpo = fopen ("noop.txt", "w+");c = fgetc (fpi);while (c != EOF){if (c == '\n'){count++;if (count == 1){fputc ('M', fpo); fputc (' ', fpo);}else{fputc (c, fpo);if (count >= 248){fputc ('F', fpo); fputc (' ', fpo);}else{fputc ('M', fpo); fputc (' ', fpo);}}}elsefputc (c, fpo);c = fgetc (fpi);}fclose (fpi);fclose (fpo);
}/**/
int
main (int argc, char *argv[])
{opfile_va ();return 0;
}
/* --(*|*)-- */
编译运行,生成文本文件nxxp.txt
gwsong@ubuntu:~/works/xdn/foo$ gcc fj.c -o fj
gwsong@ubuntu:~/works/xdn/foo$ ./fj
- 查看nxxp.txt内容,格式如下:
......
M Willy 威利/维利
M Zack 扎克
M Zachary 圣扎迦利
F Abigail 阿比盖尔
F Abby 艾比
F Ada 艾达
......
达到预期,下一步操作,在性别标识前加一列ID
- ID值从1000开始,每行增一,至结束。
程序代码如下:
/* filename: fk.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>/**/
void
opfile_vb (void)
{char c;unsigned int count = 0, id = 1000;FILE *fpi, *fpo;fpi = fopen ("nxxp.txt", "r");fpo = fopen ("nvvp.txt", "w+");c = fgetc (fpi);while (c != EOF){count++;if (count == 1){fprintf (fpo, "%d ", id);}if (c == '\n'){id++;fputc (c, fpo);fprintf (fpo, "%d ", id);}elsefputc (c, fpo);c = fgetc (fpi);}fclose (fpi);fclose (fpo);printf ("Count letter : %u, IDs: %u\n", count, id);
}/**/
int
main (int argc, char *argv[])
{opfile_vb ();return 0;
}
/* --(*|*)-- */
编译运行,得到如下结果:
songvm@ubuntu:~/works/xdn/foo$ gcc fk.c -o fk
songvm@ubuntu:~/works/xdn/foo$ ./fk
Count letter : 10525, IDs: 1580
songvm@ubuntu:~/works/xdn/foo$
- 查看结果nvvp.txt文件,基本达到预期!!!
......
1566 F Virginia 维吉妮亚
1567 F Vita 维达
1568 F Vivian 薇薇安
1569 F Wanda 旺达
1570 F Wendy 温蒂
1571 F Whitney 惠特尼
......
再进一步操作,将nvvp.txt转为JSON格式
- 用fscanf每次读一列,四次后换行!!!
- 如此就依次读出了ID、GENDER、ENGLISHNAME,CHINESENAME
- 然后简单封装为JSON对象保存到文本文件中去
程序代码如下:
/* filename: fl.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>/**/
void
opfile_vc (void)
{char buf[32] = {0};int tmp = 1, lines = 0;FILE *fpi, *fpo;fpi = fopen ("nvvp.txt", "r");fpo = fopen ("nzzp.txt", "w+");do {tmp = fscanf (fpi, "%s", buf);if (tmp == EOF) break;fprintf (fpo, "{ \"ID\" : %s, ", buf);memset (buf, 0, 32);tmp = fscanf (fpi, "%s", buf);fprintf (fpo, "\"Gender\" : \"%s\", ", buf);memset (buf, 0, 32);tmp = fscanf (fpi, "%s", buf);fprintf (fpo, "\"Name\" : \"%s\", ", buf);memset (buf, 0, 32);tmp = fscanf (fpi, "%s", buf);fprintf (fpo, "\"Chinese Name\" : \"%s\" },\n", buf);memset (buf, 0, 32);lines ++;} while (1);fclose (fpi);fclose (fpo);printf ("Read %d lines!\n", lines);
}/**/
int
main (int argc, char *argv[])
{opfile_vc ();return 0;
}
/* --(*|*)-- */
编译运行,通过!!!
songvm@ubuntu:~/works/xdn/foo$ gcc fl.c -o fl
songvm@ubuntu:~/works/xdn/foo$ ./fl
Read 581 lines!
songvm@ubuntu:~/works/xdn/foo$
查看nzzp.txt,发现几处问题,将nvvp.txt做如下修改:
- 第147行:「1147 M Leslie莱斯利」修改为: 「1147 M Leslie 莱斯利」,加一个空格将中英文名字隔开!!!
- 第188行:「1188 M Raymond」修改为:「1188 M Raymond 雷蒙德」,加中文译名!!!
- 第551行:「1551 F Tanya/谭雅坦尼娅」修改为:「1551 F Tanya 谭雅/坦尼娅」,重新分隔中英文名字!!!
以上修改后,再运行./fl,得到格式正确的json文件,可以做为测试数据用于WEB开发
......
{ "ID" : 1099, "Gender" : "M", "Name" : "Hayden", "Chinese Name" : "海顿" },
{ "ID" : 1100, "Gender" : "M", "Name" : "Henry", "Chinese Name" : "亨利" },
{ "ID" : 1101, "Gender" : "M", "Name" : "Hilton", "Chinese Name" : "希尔顿" },
{ "ID" : 1102, "Gender" : "M", "Name" : "Hugo", "Chinese Name" : "雨果" },
{ "ID" : 1103, "Gender" : "M", "Name" : "Hunk", "Chinese Name" : "汉克" },
{ "ID" : 1104, "Gender" : "M", "Name" : "Howard", "Chinese Name" : "霍华德" },
{ "ID" : 1105, "Gender" : "M", "Name" : "Henry", "Chinese Name" : "亨利" },
......
下一步研究二进制文件读写!!!