在电子词典这个项目过程中遇到了几个主要的问题,第一个是怎么解决把翻译分开这个。第二个事情就是怎么把结构体写到文件中。这两个问题,一个是关于字符串的操作一个是关于文件的操作。

strtok函数 char *strtok(char *string, char *seps)

函数功能:将字符串string中所有在seps中出现的分隔符替换掉。

返回说明:返回指向下一个标记串,当没有标记串时则返回空字符NULL。

其它说明: 当第一次调用strtok函数的时候,strtok函数跳过seps中的第一个分隔符,同时返回在string中的出现的第一个分隔符的位置的指针,用一个空字符'/0'终止。通过循环,经过多次调用strtok函数,seps中更多的分隔字符都会被'/0'替换掉,最终输出我们意图实现的字符串。

实例:

for((token = strtok(buf, “@”)); token != NULL; token = strtok(NULL, “@”))                       {
{
  k++;
  strcpy(buffer[k], token);
}

如果字符串buf中含有很多“@”分隔符,上边这个循环第一次将buf字符串的头到第一个“@”之间的字符串返回给token,可以将token赋值给buffer[k],第二次就是从第一“@”到第二个“@”之间的字符串返回给token,以此类推将整个buf中的所有数据根据分隔符“@”分开了。

第二个问题是关于文件的操作,怎么样把结构体写到文件中,怎么样定你写的结构体在文件中的读写位置。

读写结构体其实也比较简单,结构体在定义的时候,所占的内存已经确定,因此直接写进去就会按照结构体中的顺序和所占的字节数就能够直接写,但是需要注意的是,读的时候一定要写的时候格式一样,这样才能不出错。如下面的读写函数。

fwrite.c

#include <stdio.h>
#define SIZE 2
struct word
{
char word[];
int trans_num;
char trans[];
}Word[SIZE];
void save()
{
FILE *fp;
int i;
if((fp=fopen("word.dat","wb"))==NULL)
{
printf("cant open the file");
exit();
}
for(i=;i<SIZE;i++)
{
if(fwrite(&Word[i],sizeof(struct word),,fp)!=)
  printf("file write error\n");
}
fclose(fp);
}
main()
{
int i;
for(i=;i<SIZE;i++)
{
scanf("%s%d%s",&Word[i].word,&Word[i].trans_num,&Word[i].trans);
save();
}
for(i=;i<SIZE;i++)
{
printf("%s%d%s",&Word[i].word,&Word[i].trans_num,&Word[i].trans);
}
}

fread.c

#include <stdio.h>
#define SIZE 2
struct word
{
  char word[];
  int trans_num;
  char trans[];
}Word[SIZE];
void read()
{
  FILE *fp;
  int i;
  if((fp=fopen("word.dat","rb"))==NULL)
  {
printf("cant open the file");
exit();
  }
  for(i=;i<SIZE;i++)
  {
   if(fread(&Word[i],sizeof(struct word),,fp)!=)
   printf("file write error\n");
  }
  fclose(fp);
}
main()
{
  int i;
  read();
  for(i=;i<SIZE;i++)
  {
  printf("%s%d%s",&Word[i].word,&Word[i].trans_num,&Word[i].trans);
   printf("\n");
  }
}

上边两个程序就是结构体的读写函数,上边程序你可以在运行的时候计算一下一个结构体的字节数,你会发现都是一样的大小,因此如果你要想要直接从dat文件中读出结构体数组中的第二个元素,你就可以fseek函数定位到第二个元素的其实位置直接读就可以了。

int fseek( FILE *stream, long offset, int origin );

第一个参数stream为文件指针

第二个参数offset为偏移量,整数表示正向偏移,负数表示负向偏移

第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET

SEEK_SET: 文件开头

SEEK_CUR: 当前位置

SEEK_END: 文件结尾

对于上边的代码来说,如果想要读出第二个元素就可以在fread函数前加 fseek(FILE *fp, sizeof(struct word), SEEK_SET); 这样就是从第二个元素开始读,如果有一个更大的文件还是以这个格式写进去的话,可以通过 fseek(FILE *fp,n* sizeof(struct word), SEEK_SET); 来直接读出第n个结点的值。

strtok()函数、fseek()函数、fwrite()函数、fread()函数的使用的更多相关文章

  1. open()、fwrite()、fread()函数使用说明与示例

    fopen()函数: 1.作用: 在C语言中fopen()函数用于打开指定路径的文件,获取指向该文件的指针. 2.函数原型: FILE * fopen(const char * path,const ...

  2. fopen()、fwrite()、fread()函数使用说明与示例

    fopen()函数: 1.作用: 在C语言中fopen()函数用于打开指定路径的文件,获取指向该文件的指针. 2.函数原型: FILE * fopen(const char * path,const  ...

  3. fwrite和fread函数的用法小结(转)

    fwrite和fread是以记录为单位的I/O函数,fread和fwrite函数一般用于二进制文件的输入输出. #include <stdio.h> size_t fread(void * ...

  4. NX二次开发-C语言文件读写fwrite和fread函数

    NX9+VS2012 #include <uf.h> #include <stdio.h> UF_initialize(); /* //设置文件路径 const char* f ...

  5. 函数fgets和fputs、fread和fwrite、fscanf和fprintf用法小结 (转)

    函数fgets和fputs.fread和fwrite.fscanf和fprintf用法小结 字符串读写函数fgets和fputs 一.读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符 ...

  6. 函数fgets和fputs、fread和fwrite用法小结(转)

    字符串读写函数fgets和fputs: 1.fgets()函数:原型char *fgets(char *s, int n, FILE *stream);从流中读取n-1(n默认1024)个字符之前,如 ...

  7. MATLAB中提高fwrite和fprintf函数的I/O性能

    提高fwrite和fprintf函数的I/O性能 http://www.matlabsky.com/thread-34861-1-1.html     今天我们将讨论下著名的fwrite(fprint ...

  8. C中fread()函数的返回值

    这个问题很容易搞错,并导致很多问题,需要强调的是fread函数返回的并不是字节数. realRead = fread(buf,item,count,fp)    (每次读item大小的数据块,分cou ...

  9. Matlab中的fread函数

    Matlab中fread函数用法    "fread"以二进制形式,从文件读出数据. 语法1:[a,count]=fread(fid,size,precision) 语法2:[a, ...

随机推荐

  1. 使用 Notepad 或 TextEdit 来编写 HTML

    可以使用专业的 HTML 编辑器来编辑 HTML: Adobe Dreamweaver Microsoft Expression Web CoffeeCup HTML Editor 不过,我们同时推荐 ...

  2. Dependency Property 依赖属性

    依赖属性就是一种可以自己没有值,并能通过使用Binding从数据源获得值(依赖在别人身上)的属性.拥有依赖属性的对象称为“依赖对象”. WPF开发中,必须使用依赖对象作为依赖属性的宿主,使二者结合起来 ...

  3. SurvivalShooter学习笔记(五.敌人生命)

    敌人生命系统(受伤 死亡) 敌人生成后有初始生命,被攻击受伤有打击特效,降低生命值,直至死亡: 死亡后怪物:播放死亡音效,动画,然后下沉地表,销毁:玩家:得到相应分数. 敌人生命脚本如下: 1.变量: ...

  4. SurvivalShooter学习笔记(四.敌人攻击)

    此案例中,敌人始终朝着玩家移动 到达攻击玩家范围时(身上的大的触发器被玩家触发时(敌人靠近玩家,当身上的触发器被触发,且对象是玩家时条件达成)) 隔一个时间端,打击玩家一下,对玩家造成伤害,玩家掉血, ...

  5. Bootstrap组件之下拉菜单

    .dropdown--设置父元素为下拉菜单组件,向下弹出子菜单: .dropup--设置父元素为下拉菜单组件,向上弹出子菜单: .dropdown-toggle--设置button为下拉菜单切换but ...

  6. Delphi TreeView – 自动展开树形结构

    Delphi TreeView – 自动展开树形结构 当处理完TreeView控件树形结构的数据后,需要默认自动全部展开,可以用到TreeView的Expanded属性. 1 2 3 4 5 6 7 ...

  7. 【BZOJ3813】奇数国 线段树+欧拉函数

    [BZOJ3813]奇数国 Description 给定一个序列,每次改变一个位置的数,或是询问一段区间的数的乘积的phi值.每个数都可以表示成前60个质数的若干次方的乘积. Sample Input ...

  8. 巨蟒python全栈开发-第8天 文件操作

    一.文件操作 今日大纲: 1.文件操作->open() open 打开 f=open(文件路径,mode='模式',encoding='编码格式') #python最最底层操作的就是bytes ...

  9. bash短路径显示

    修改.bashrc文件vim 打开.bashrc文件,找到如下这行,有两个,都修改一下: PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' 将上面 ...

  10. js parseInt()函数中的问题。。

    今天在看<javascript 高级程序设计>时, 与我的输出结果不符合, <!DOCTYPE html> <html lang="en"> & ...