strtok()函数、fseek()函数、fwrite()函数、fread()函数的使用
在电子词典这个项目过程中遇到了几个主要的问题,第一个是怎么解决把翻译分开这个。第二个事情就是怎么把结构体写到文件中。这两个问题,一个是关于字符串的操作一个是关于文件的操作。
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()函数的使用的更多相关文章
- open()、fwrite()、fread()函数使用说明与示例
fopen()函数: 1.作用: 在C语言中fopen()函数用于打开指定路径的文件,获取指向该文件的指针. 2.函数原型: FILE * fopen(const char * path,const ...
- fopen()、fwrite()、fread()函数使用说明与示例
fopen()函数: 1.作用: 在C语言中fopen()函数用于打开指定路径的文件,获取指向该文件的指针. 2.函数原型: FILE * fopen(const char * path,const ...
- fwrite和fread函数的用法小结(转)
fwrite和fread是以记录为单位的I/O函数,fread和fwrite函数一般用于二进制文件的输入输出. #include <stdio.h> size_t fread(void * ...
- NX二次开发-C语言文件读写fwrite和fread函数
NX9+VS2012 #include <uf.h> #include <stdio.h> UF_initialize(); /* //设置文件路径 const char* f ...
- 函数fgets和fputs、fread和fwrite、fscanf和fprintf用法小结 (转)
函数fgets和fputs.fread和fwrite.fscanf和fprintf用法小结 字符串读写函数fgets和fputs 一.读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符 ...
- 函数fgets和fputs、fread和fwrite用法小结(转)
字符串读写函数fgets和fputs: 1.fgets()函数:原型char *fgets(char *s, int n, FILE *stream);从流中读取n-1(n默认1024)个字符之前,如 ...
- MATLAB中提高fwrite和fprintf函数的I/O性能
提高fwrite和fprintf函数的I/O性能 http://www.matlabsky.com/thread-34861-1-1.html 今天我们将讨论下著名的fwrite(fprint ...
- C中fread()函数的返回值
这个问题很容易搞错,并导致很多问题,需要强调的是fread函数返回的并不是字节数. realRead = fread(buf,item,count,fp) (每次读item大小的数据块,分cou ...
- Matlab中的fread函数
Matlab中fread函数用法 "fread"以二进制形式,从文件读出数据. 语法1:[a,count]=fread(fid,size,precision) 语法2:[a, ...
随机推荐
- 从TensorFlow0.12升级到TensorFlow1.13
sudo pip install --upgrade tensorflow-gpu $ sudo pip install --upgrade tensorflow-gpu[sudo] password ...
- 尽管以C++为基础,但 Java 是一种更纯粹的面向对象程序设计语言
“尽管以C++为基础,但 Java 是一种更纯粹的面向对象程序设计语言”. 无论C++还是Java 都属于杂合语言.但在 Java 中,设计者觉得这种杂合并不象在 C++里那么重要.杂合语言 允许采用 ...
- centos7 禁用每次sudo 需要输入密码
安装完centos7后,默认没有启用sudo,首先应该是对sudo进行设置.sudo的作用就是使当前非root用户在使用没有权限的命令 时,直接在命令前加入sudo,在输入自己当前用户的密码就可以完成 ...
- VUE:使用vue-cli脚手架无法安装npm install axios 的巨坑
使用命令 npm install axios 安装axios可能会报错,无法引用, 这个时候使用淘宝的镜像cnpm安装就可以了 cnpm install axios 如果没有安装cnpm,执行以下命令 ...
- 【VBA】制作散点图及打标签VBA
1.散点图的制作必须只选择xy轴对应的数据,不能选中标签. 2.调整xy轴交叉点,改为四个象限. 3.通过菜单移动散点图到新表. 4.运行宏,打上文本标签. VBA如下 Sub AttachLabel ...
- Hadoop2的HA安装(high availability):nfs+zookeeper
前面介绍过hadoop的简单安装和FA安装,在这里将介绍几种hadoop2中HA(高可用性)安装,HA技术使hadoop不再存在单点namenode的故障. 先来第一种:nfs+zookeeper H ...
- vue项目创建步骤小结
第一步创建项目目录demo cd demo npm init 生成package.json 初始化项目工具使用 命令行工具 (CLI) 快速初始化 # 全局安装 vue-cli $ npm inst ...
- 用12个例子全面示范Angular的模板语法
template分支,用12个例子全面示范Angular的模板语法 // 使用方法 git clone https://git.oschina.net/mumu-osc/learn-component ...
- 一入python深似海--变量和对象
一.基本原理 Python中一切都是对象,变量是对象的引用. 这是一个普遍的法则.我们举个样例来说.Python是怎样来处理的. x = 'blue' y = 'green' z = x 当pytho ...
- ModelShowDialog缓存上次浏览的URL
1. 一种解决方法设置每次清楚浏览的页面. In IE7, go to Tools | Internet Options. Click the Browsing History "Se ...