fseek用法

fseek用来移动文件指针。函数原型

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

参数解释:

  • stream 是文件流指针
  • offset 是相对文件起始位置的偏移量
  • fromwhere移动到哪儿。 其值如下
    • SEEK_SET:从距文件开头 offset 位移量为新的读写位置;
    • SEEK_CUR:以目前的读写位置往后增加 offset 个位移量;
    • SEEK_END:将读写位置指向文件尾后再增加 offset 个位移量。

例如:

将读写位置移动到文件开头:fseek(fp, 0, SEEK_SET);

将读写位置移动到文件尾时:fseek(fp, 0, SEEK_END);

将读写位置动到离文件开头100字节处:fseek(fp,100L, SEEK_SET);

将读写指针移动到离文件当前位置100字节处:fseek(fp,100L, SEEK_CUR);

将读写指针退回到离文件结尾100字节处:fseek(fp, -100L, SEEK_END);

准备代码

准备一个下面的结构体,用作演示

struct st_type_no_item_
{
/// 类型
int type_ = 0;
/// 编号
int no_ = 0; st_type_no_item_()
{
type_ = 0;
no_ = 0;
}
};
///
using st_type_no_item = st_type_no_item_;

写二进制文件

使用函数fwrite实现写入,演示使用,当然,你可以加上函数的返回值,表示写入文件的结果

void write_file_(std::string str)
{
FILE *pfile = nullptr;
int ret = fopen_s(&pfile, str.c_str(), "wb"); /// 0 = 打开成功,
if (0 == ret)
{
if (pfile)
{
/// 准备内存
st_type_no_item item;
item.type_ = 0x22;
item.no_ = 0x33; int len = sizeof(st_type_no_item);
/// 写文件
int write_length = fwrite(&item, sizeof(st_type_no_item), 1, pfile);
fclose(pfile);
pfile = nullptr; std::cout << "\n 写文件成功, 写入长度=" << write_length << "\n";
}
else
{
;/// pfile 文件指针为null
std::cout << "\n 写文件失败, pfile = null \n\n";
}
}
else
{
;/// 打开失败
std::cout << "\n 写文件失败,文件打开失败\n\n";
}
}

读二进制文件

使用函数fread读取二进制文件。 需要注意fread函数的参数。 应该检查其返回值于函数的第三个参数是否相等,如果不相等,则读取失败。 相等则读取成功

/// ----------------------------------------------------------------------------------------
/// 读文件
void read_file_(std::string str)
{
FILE *pfile = nullptr;
int ret = fopen_s(&pfile, str.c_str(), "rb"); /// 0 = 打开成功,
if (0 == ret)
{
if (pfile)
{
fseek(pfile, 0, SEEK_END);
unsigned int file_length_bytes = ftell(pfile);
fseek(pfile, 0, SEEK_SET); if (0 < file_length_bytes)
{
/// 准备内存
st_type_no_item item;
char arr[8] = { 0 };
/// 读文件.参数依次是: 文件读取缓存、缓存的类型基本长度、需要读取多少个单位的缓存、文件流
/// 这里演示: item是缓存, sizeof(st_type_no_item)表示item的长度, 1表示读取一个单位的item(8字节),pfile是文件流
/// fread成功,将返回 第三个参数相同的值,说明读取成功,其他失败。
int readlen = fread(&item, sizeof(st_type_no_item), 1, pfile); std::cout << "\n 读文件成功, type=" << item.type_ << ", no=" << item.no_ << "\n\n";
}
else
{
;/// 文件长度为0
} /// 关闭文件
fclose(pfile);
pfile = nullptr;
}
else
{
;/// pfile 文件指针为null
std::cout << "\n 读文件失败, pfile = null \n\n";
}
}
else
{
;/// 打开失败
std::cout << "\n 读文件失败,文件打开失败\n\n";
}
}

结果

完整演示代码


#include <iostream> /// 判断文件是否存在
bool is_exist_file_(std::string&& str_file)
{
struct stat st; return (0 == stat(str_file.c_str(), &st));
} struct st_type_no_item_
{
int type_ = 0;
int no_ = 0; st_type_no_item_()
{
type_ = 0;
no_ = 0;
}
};
///
using st_type_no_item = st_type_no_item_; /// ----------------------------------------------------------------------------------------
/// 写文件
void write_file_(std::string str)
{
FILE *pfile = nullptr;
int ret = fopen_s(&pfile, str.c_str(), "wb"); /// 0 = 打开成功,
if (0 == ret)
{
if (pfile)
{
/// 准备内存
st_type_no_item item;
item.type_ = 0x22;
item.no_ = 0x33; int len = sizeof(st_type_no_item);
/// 写文件
int write_length = fwrite(&item, sizeof(st_type_no_item), 1, pfile);
fclose(pfile);
pfile = nullptr; std::cout << "\n 写文件成功, 写入长度=" << write_length << "\n";
}
else
{
;/// pfile 文件指针为null
std::cout << "\n 写文件失败, pfile = null \n\n";
}
}
else
{
;/// 打开失败
std::cout << "\n 写文件失败,文件打开失败\n\n";
}
} /// ----------------------------------------------------------------------------------------
/// 读文件
void read_file_(std::string str)
{
FILE *pfile = nullptr;
int ret = fopen_s(&pfile, str.c_str(), "rb"); /// 0 = 打开成功,
if (0 == ret)
{
if (pfile)
{
fseek(pfile, 0, SEEK_END);
unsigned int file_length_bytes = ftell(pfile);
fseek(pfile, 0, SEEK_SET); if (0 < file_length_bytes)
{
/// 准备内存
st_type_no_item item;
char arr[8] = { 0 };
/// 读文件.参数依次是: 文件读取缓存、缓存的类型基本长度、需要读取多少个单位的缓存、文件流
/// 这里演示: item是缓存, sizeof(st_type_no_item)表示item的长度, 1表示读取一个单位的item(8字节),pfile是文件流
/// fread成功,将返回 第三个参数相同的值,说明读取成功,其他失败。
int readlen = fread(&item, sizeof(st_type_no_item), 1, pfile); std::cout << "\n 读文件成功, type=" << item.type_ << ", no=" << item.no_ << "\n\n";
}
else
{
;/// 文件长度为0
} /// 关闭文件
fclose(pfile);
pfile = nullptr;
}
else
{
;/// pfile 文件指针为null
std::cout << "\n 读文件失败, pfile = null \n\n";
}
}
else
{
;/// 打开失败
std::cout << "\n 读文件失败,文件打开失败\n\n";
}
} /// ----------------------------------------------------------------------------------------
int main()
{
std::string str = "C:\\game\\demo.txt"; bool is_exist = true;// is_exist_file_(std::move(str));
if (!is_exist)
return 0; /// 写文件 write_file_(str);
read_file_(str); std::cout << is_exist << "\n\n\n";
}

fread_s读取文件

下面的完整代码演示了使用函数fread_s读取二进制文件


#include <iostream> /// 判断文件是否存在
bool is_exist_file_(std::string&& str_file)
{
struct stat st; return (0 == stat(str_file.c_str(), &st));
} struct st_type_no_item_
{
int type_ = 0;
int no_ = 0; st_type_no_item_()
{
type_ = 0;
no_ = 0;
}
};
///
using st_type_no_item = st_type_no_item_; /// ----------------------------------------------------------------------------------------
/// 写文件
void write_file_(std::string str)
{
FILE *pfile = nullptr;
int ret = fopen_s(&pfile, str.c_str(), "wb"); /// 0 = 打开成功,
if (0 == ret)
{
if (pfile)
{
/// 准备内存
st_type_no_item item[2];
item[0].type_ = 0x1;
item[0].no_ = 0x1;
item[1].type_ = 0x2;
item[1].no_ = 0x2; int len = sizeof(st_type_no_item);
/// 写文件
int write_result = fwrite(item, sizeof(st_type_no_item), 2, pfile);
if (write_result != 2)
{
std::cout << "write error , ret=" << write_result << "\n";
}
else
{
std::cout << "write success, ret=" << write_result << "\n";
} fclose(pfile);
pfile = nullptr;
}
else
{
;/// pfile 文件指针为null
std::cout << "\n 写文件失败, pfile = null \n\n";
}
}
else
{
;/// 打开失败
std::cout << "\n 写文件失败,文件打开失败\n\n";
}
} /// ----------------------------------------------------------------------------------------
/// 读文件
void read_file_(std::string str)
{
FILE *pfile = nullptr;
int ret = fopen_s(&pfile, str.c_str(), "rb"); /// 0 = 打开成功,
if (0 == ret)
{
if (pfile)
{
fseek(pfile, 0, SEEK_END);
unsigned int file_length_bytes = ftell(pfile);
fseek(pfile, 0, SEEK_SET); if (0 < file_length_bytes)
{
/// 准备内存
st_type_no_item item[2];
/// 读文件.参数依次是: 文件读取缓存、缓存的类型基本长度、需要读取多少个单位的缓存、文件流
/// 这里演示: item是缓存, sizeof(st_type_no_item)表示item的长度, 1表示读取一个单位的item(8字节),pfile是文件流
/// fread成功,将返回 第三个参数相同的值,说明读取成功,其他失败。
//int readlen = fread(&item, sizeof(st_type_no_item), 1, pfile);
int ret = fread_s(item, sizeof(st_type_no_item) * 2, sizeof(st_type_no_item), 2, pfile);
std::cout << "ret=" << ret << "\n";
std::cout << "type0=" << item[0].type_ << ", no0=" << item[0].no_ << "\n";
std::cout << "type1=" << item[1].type_ << ", no1=" << item[1].no_ << "\n";
//std::cout << "\n 读文件成功, type=" << item.type_ << ", no=" << item.no_ << "\n\n";
}
else
{
;/// 文件长度为0
} /// 关闭文件
fclose(pfile);
pfile = nullptr;
}
else
{
;/// pfile 文件指针为null
std::cout << "\n 读文件失败, pfile = null \n\n";
}
}
else
{
;/// 打开失败
std::cout << "\n 读文件失败,文件打开失败\n\n";
}
} /// ----------------------------------------------------------------------------------------
int main()
{
std::string str = "C:\\game\\demo.txt"; bool is_exist = true;// is_exist_file_(std::move(str));
if (!is_exist)
return 0; /// 写文件 write_file_(str);
read_file_(str); std::cout << is_exist << "\n\n\n";
}

C语言读写二进制文件的更多相关文章

  1. [Matlab+C/C++] 读写二进制文件

    introduction 因为Matlab操作简单.方便,它被应用于很多领域:音频处理,图像处理,数值计算等.尽管MATLAB容易操作,但受限于他的语言解释机制,MATLAB的执行速度通常较低.C/C ...

  2. R语言读写中文编码方式

    最近遇到一个很头疼的事,就是 R语言读写中文编码方式.在网上找到了一篇博文,谢谢博主的精彩分享,让我很快解决了问题,在此也分享一下 R语言读写数据的方法很多,这里主要是我在使用read.csv/rea ...

  3. 【转】C++读写二进制文件

    原文网址:http://blog.csdn.net/lightlater/article/details/6364931 摘要: 使用C++读写二进制文件,在开发中操作的比较频繁,今天有幸找到一篇文章 ...

  4. C/C++读写二进制文件

    C++读写二进制文件 最近在给android层提供支持,因此代码都是用标准库库函数写出来的,好多windows和第三方的库不能或者很难使用,下面有我在读写二进制文件时候的一些心得,也算是一种总结吧 1 ...

  5. R语言读写数据

    R语言读写数据 一般做模型的时候,从外部的excel中读入数据,我现在常用的比较多的是read_csv(file) 读入之前先把excel数据转化成.csv格式 同样的把结果输出来的时候用的是writ ...

  6. C++封装C语言读写文件

    自己项目需要,封装C语言读写文件. 为了兼容低版本的编译器,因为低版本的编译器(比如,Vs2010,Vs2008)他们可能不支持 modern c++. 项目 使用 cmake管理的项目. 可以在 g ...

  7. C语言读写文件

    对文件的读和写是最常用的文件操作.在C语言中提供了多种文件读写的函数: 字符读写函数  :fgetc和fputc 字符串读写函数:fgets和fputs 数据块读写函数:freed和fwrite 格式 ...

  8. c++读写二进制文件

    要读取文件必须包含<fstream>头文件,这里包含了C++读写文件的方法,可以使用fstream 类,这个类可以对文件进行读写操作.   1.打开文件.   打开文件可以有两种方式,第一 ...

  9. Java读写二进制文件示例

    相对于文本文件,二进制文件读写快,定位快而准,下面是代码示例: import java.io.DataInput; import java.io.DataOutput; import java.io. ...

随机推荐

  1. 洛谷 P3438 - [POI2006]ZAB-Frogs(乱搞/李超线段树)

    题面传送门 首先一眼二分答案,我们假设距离 \((i,j)\) 最近的 scarefrog 离它的距离为 \(mn_{i,j}\),那么当我们二分到 \(mid\) 时我们显然只能经过 \(mn_{i ...

  2. Python基础之列表内置方法

    目录 1. 列表 1.1 序列 1.2 通用的序列操作 1.3 列表的基本操作 1.4 列表方法 1. 列表 数据结构:以某种方式(如通过编号)组合起来的元素(如数,字符乃至其他数据结构)集合. 在p ...

  3. gcc 的编译流程 和gdb的调试方法

    GCC的编译流程分为四个步骤: 预处理(Pre-Processing) 编译(Compiling) 汇编(Assembling) 链接(Linking) 可以看的出来文件大小 gdb 调试 gdb - ...

  4. 表格table的宽度问题

    首先注意table的一个样式 table { table-layout:fixed; } table-layout有以下取值: automatic 默认.列宽度由单元格内容设定 fixed 列宽由表格 ...

  5. 入坑不亏!我们最终决定将 70w+ 核心代码全部开源

    作者 | 一啸 来源 | 尔达 Erda 公众号 背景故事 2017 年初,我们基于 DC/OS (mesos + marathon) 开始构建端点自己的 PaaS 平台,核心任务就是解决公司的软件开 ...

  6. day28 进程(Process)

    day28 进程(Process) 1.进程的概念 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础. # 进程是系统进行 ...

  7. 【STM32】使用SDIO进行SD卡读写,包含文件管理FatFs(三)-SD卡的操作流程

    其他链接 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(一)-初步认识SD卡 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(二)-了解SD总线,命令的相关介绍 ...

  8. 节省内存的循环banner(一)

    循环banner是指scrollview首尾相连,循环播放的效果,使用非常广泛.例如淘宝的广告栏等. 如果是简单的做法可以把所有要显示的图片全部放进一个数组里,创建相同个数的图片视图来显示图片.这样的 ...

  9. Oracle存储过程游标for循环怎么写

    一.不带参数的游标for循环 首先编写存储过程的整体结构,如下: create or replace procedure test_proc is v_date date; --变量定义 begin ...

  10. 【Linux】【Services】【Docker】网络

    容器的网络模型: closed container: 仅有一个接口:loopback 不参与网络通信,仅适用于无须网络通信的应用场景,例如备份.程序调试等: --net none bridged co ...