C语言 一个文本文件中存有数字 单词 汉字 怎么正确简单的读取?

xxxiaoxiami 2008-07-23 06:24:42
本人现在正在和同伴做一个小项目,DOS环境下运行 的 我爱背单词;可是没有学过数据库,老师给了一个文本文件,里面存放有36899个单词的信息,行如:
118 "abe" "艾贝(人名)" 0
119 "abeam" "ad. 向着船舷" 0
120 "abed" "ad. 在床上" 0
121 "aberrant" "adj. 脱离常轨的;越轨的,异常的" 0
122 "aberration" "n. 越轨,光行差,心理失常,色差" 0
123 "abet" "v. 教唆,协助(罪犯)" 0
124 "abettor" "n. 唆使者" 0
125 "abeyance" "n. 中止,暂搁" 0
126 "abhor" "v. 憎恨,嫌恶" 0
127 "abhorrence" "n. 痛恨" 0
128 "abhorrence of" "厌恶,痛恨" 0
129 "abhorrent" "adj. 可恨的,可厌的" 0
130 "abide" "vt.遵守 vt.忍受" 0
131 "abide by" "遵守(法律等);信守;固定" 0
132 "abiding" "a.持久的,永久的" 0
133 "ability" "n.能力;能耐,本领" 0
134 "ability-to-pay principle" "纳税能力原则" 0
135 "abject" "adj. 极可怜的,卑屈的" 0
136 "abjure" "v. 誓绝,弃绝" 0
137 "ablaze" "a. 着火的,闪亮的,激昂的" 0

没有学过数据库 请问高手们 有什么方法能把这些信息读入吗?读入时还要分清类别 ,便于输出!
背单词 牵涉到产生一个随机序号 然后输出这个随机序号相对应的 单词的汉语意思,让用户输入单词然后比较输入结果,个人不懂 的就是在产生随机序号后 如何让这个序号对应 的 信息读取出来!
说的有点多 ,也不知道能不能看懂!
小弟在此谢过各位了!
...全文
1277 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
q296645660 2011-12-11
  • 打赏
  • 举报
回复
#include"wchar.h"
#include<string.h>
struct student_type{
int num;
char name[10]; /*数据的结构体*/
char sex[3];
float chengji;}student[100];
int _tmain(int argc, _TCHAR* argv[])
{ int i,j,num;
float chengji;
char c[10]; /*数组C用于存放名字*/
FILE*p;
p=fopen("F:\\student.txt","r"); /*打开文件夹*/
for(i=0;i<100;i++){
fscanf(p,"%d",&student[i].num);
fscanf(p,"%s",&student[i].name); /*把文件的数据读入数组*/
fscanf(p,"%s",&student[i].sex);
fscanf(p,"%f",&student[i].chengji);
}
printf("************************************\n");
printf("请输入您要的查询的方式:1 按名字 2 按学号 3按成绩 0 退出\n");
scanf("%d",&j);
for(;j!=0;) /*实现循环*/
{switch(j)
{
case 1:
printf("请输入名字:");
scanf("%s",&c);
for(i=0;i<100;i++) /*按名字查询部分*/
{ if(strcmp(student[i].name,c)==0)
printf("%d %s %s %f\n",student[i].num,student[i].name,student[i].sex,student[i].chengji);}
break;
case 2: /*按学号查询部分*/
printf("请输入学号:");
scanf("%d",&num);
for(i=0;i<100;i++)
{if(student[i].num==num)
printf("%d %s %s %f\n",student[i].num, student[i].name,student[i].sex,student[i].chengji);}
break;
case 3:
printf("请输入成绩:"); /*按成绩查询部分*/
scanf("%f",&chengji);
for(i=0;i<100;i++)
{ if(student[i].chengji==chengji)
printf("%d %s %s %f\n",student[i].num, student[i].name,student[i].sex,student[i].chengji);}
break;
default :
printf("************************************\n");
printf("请输入您要的查询的方式:1 按名字 2 按学号 3 按成绩 0 退出\n");
scanf("%d",&j);
}
printf("************************************\n");
printf("请输入您要的查询的方式:1 按名字 2 按学号 3 按成绩 0 退出\n"); /*重复输出选择界面*/
scanf("%d",&j);
}
return 0;
}
q296645660 2011-12-11
  • 打赏
  • 举报
回复
直接读
wangjy17908 2008-07-25
  • 打赏
  • 举报
回复
分割方法:

遇到第一个空格+"时候就认为是英文单词开始,再次碰到"时候就认为英文单词结束,遇到第二个空格+"时候就认为是中文解释开始,再次碰到"时候就认为中文解释结束----因为英文词组和中文解释中可能含有空格,所以,不能单纯的靠空格来分割。

不知道这样的思路明白了没?

具体的代码我还没有时间写,你可以先试试看,其中一种方法是:将一行的文字存在一个char[]型Buffer中,逐个与空格和"进行比较,再将需要的字符串截取出来。
^_^
我看你有戏 2008-07-24
  • 打赏
  • 举报
回复
需要用到链表的知识
九十度黑 2008-07-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zzzlll1983 的回复:]
现在的男生都喜欢用女的头像吗?
哈哈!~
了解csdn的特性啊!~
[/Quote]
什么特性!?

我的思路:
1.从输入用fgetc(FILE *);分析每个字符,根据字符串的开始和结束标志如' " '或' 0 '读序号、英文和中文字符。
2.为每个单词建立结构体,存储英文和中文字符串。
3.建立指针数组,根据序号把结构体地址存入数组中。(每建立一个结构体为数组赋值一次)
4.main函数产生随机数,根据随机数访问数组获取结构体地址,输出结构体中文字符串,等待用户输入,输入后匹配结构体中的英文与输入信息是否相等。
xxxiaoxiami 2008-07-24
  • 打赏
  • 举报
回复
如何产生随机数 这个地方我知道 关键是如何把这些单词信息读入计算机 就是 以什么方式 以及 怎么读入?还望各位能给点详细的知道 关键就在信息读入这部分!
xxxiaoxiami 2008-07-24
  • 打赏
  • 举报
回复
现在我问题的关键是怎么分割两个引号之间的 单词 或者是 汉语意思 !思路已经 很清晰了!谢谢各位了!
wangjy17908 2008-07-24
  • 打赏
  • 举报
回复
我认为可以使用结构体数组(因为总数是知道的),也可以使用链表。

节点定义一个int(存储编号如:118 );
两个char[],分别用于存储"abe"和"艾贝(人名)";
若是数组就可以不定义存储编号的变量,直接用下标代替就可以。

读文件的时候,一行一行读取;读入一行对该行字符串进行分析,最好用引号进行分割,然后将这些数据分别写在数组或者链表中。

查找的时候直接用该随机数作为下标或者链表的int数据就能取得节点位置,然后输出对应的英文和中文信息。

LZ可以试试看,不行可以联系我。
wuyinggu 2008-07-24
  • 打赏
  • 举报
回复
步骤:
1,产生随机号
2,根据随机号找到对应的数据,比如118对应"abe" "艾贝(人名)" 0
这个要看你数据是怎么做的了,一般给个索引就搞定了.
3,读取数据,分清类别还不容易,可根据unicode码,一般情况下< 0x80 为字符数字,大于则可视为汉字.
4,如果根据你提供的数据结构,第一个双引号的为单词,接下来的是解释.读取出数据后就可分离出单词和解释咯
5,显示解释并接收用户输入,将输入和正确单词比较,得出结果.
6,结束
上山老人 2008-07-24
  • 打赏
  • 举报
回复
只能up
K行天下 2008-07-23
  • 打赏
  • 举报
回复

#include <time.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
int n ;
srand(time(0));
for(int i=0;i<100;i++)
{
n = (rand()*rand())%36900;//产生0-36899之间的整数,因为rand()产生的数范围是最大到RAND_MAX
//一般是32767
printf("%d\t%d\n",n,RAND_MAX);
}
}

得到这个n之后, 你的文件是一行一行保存的话 直接跳过前面的 n-1行 读取第n行即可
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 HBFBI 的回复:]
信息读入 直接用fopen()函数打开文本文件,再优化下就可以了!
随机序号 可以用随机函数random()或者rand()产生随机数,再适当修改对应到随机序号,然后在文本文件查找此序号,把
序号后面的内容显示出来就可以了!
不过 DOS环境下好像不能显示汉字啊!
研究研究...!
[/Quote]
随机序号每次不都是随机的吗?貌似没法对应吧???
还是排序放好,之后随机产生数,就随机读取该数所在行的数据。
zzzlll1983 2008-07-23
  • 打赏
  • 举报
回复
现在的男生都喜欢用女的头像吗?
哈哈!~
了解csdn的特性啊!~

HBFBI 2008-07-23
  • 打赏
  • 举报
回复
信息读入 直接用fopen()函数打开文本文件,再优化下就可以了!
随机序号 可以用随机函数random()或者rand()产生随机数,再适当修改对应到随机序号,然后在文本文件查找此序号,把
序号后面的内容显示出来就可以了!
不过 DOS环境下好像不能显示汉字啊!
研究研究...!
ChamPagneZ 2008-07-23
  • 打赏
  • 举报
回复
先Mark

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧