玉溪市建设厅官方网站,网站备案IP与空间,简述网站开发工作流程,shopex网站【图书推荐】《Linux C与C一线开发实践#xff08;第2版#xff09;》_linux c与c一线开发实践pdf-CSDN博客
《Linux C与C一线开发实践#xff08;第2版#xff09;#xff08;Linux技术丛书#xff09;》(朱文伟#xff0c;李建英)【摘要 书评 试读】- 京东图书
Linu…【图书推荐】《Linux C与C一线开发实践第2版》_linux c与c一线开发实践pdf-CSDN博客
《Linux C与C一线开发实践第2版Linux技术丛书》(朱文伟李建英)【摘要 书评 试读】- 京东图书
LinuxC\C编程技术_夏天又到了的博客-CSDN博客
4.9.7 文件位置指针
先复习一下C语言中的文件指针定位函数fseek()其声明如下
int fseek(FILE *fp, LONG offset, int origin)
其中fp是文件指针offset是相对于origin规定的偏移位置量origin是指针移动的起始位置可设置为以下3种情况
SEEK_SET文件开始位置。SEEK_CUR文件当前位置。SEEK_END文件结束位置。
当offset是向文件末尾方向偏移的时候无论偏移量是否超出文件末尾fseek都返回0当偏移量没有超出文件末尾的时候文件指针指向正常的偏移地址当偏移量超出文件末尾的时候文件指针指向文件末尾并不会返回表示偏移出错的-1值。当offset向文件头方向偏移的时候如果偏移量没有超出文件头就是正常偏移文件指针指向正确的偏移地址fseek返回值为0当偏移量超出文件头时fseek返回-1值文件指针不变还是处于原来的地址。
在C中istream和ostream也提供了用于重新定位文件位置指针的成员函数seekg和seekpseekg用于设置输入文件流的文件流指针位置而seekp用于设置输出文件流的文件流指针位置。它们的声明如下
ostream seekp( streampos pos );ostream seekp( streamoff off, ios::seek_dir dir );istream seekg( streampos pos );istream seekg( streamoff off, ios::seek_dir dir );
其中pos表示新的文件流指针位置值off表示需要偏移的值dir表示搜索的起始位置该参数的类型是一个枚举
enum seek_dir {beg, cur, end};
每个枚举常量的含义如下
ios::beg文件流的起始位置默认值从流的开头开始定位。ios::cur文件流的当前位置。ios::end文件流的结束位置。
文件位置指针是一个整数值指定了从文件的起始位置到指针所在位置的字节数。下面是关于定位文件位置指针的代码片段。
// 定位到 fileObject 的第 n 个字节假设是 ios::beg
fileObject.seekg( n );// 把文件的读指针从 fileObject 当前位置向后移 n 个字节
fileObject.seekg( n, ios::cur );// 把文件的读指针从 fileObject 末尾往回移 n 个字节
fileObject.seekg( n, ios::end );// 定位到 fileObject 的末尾
fileObject.seekg( 0, ios::end );下面的例子使用这些函数来获得一个二进制文件的大小。
【例4.14】获得二进制文件的大小
1打开Visual Studio Code新建文本文件test.cpp输入代码如下
#include iostream
#include fstream
using namespace std;const char * filename afile.dat; // afile.dat在前面的例子中已经生成了int main() {long l, m;ifstream file(filename, ios::in | ios::binary);l file.tellg();file.seekg(0, ios::end);m file.tellg();file.close();cout size of filename;cout is (m - l) bytes.\n;return 0;
}2上传test.cpp到Linux在终端下输入命令g -o test test.cpp然后运行test运行结果如下
# g -o test test.cpp# ./testsize of afile.dat is 7 bytes.
假设当前目录下有一个文件afile.dat大小为7字节上面的代码就可以判断出其大小。同时我们可以在命令行下验证一下
# ll afile.dat-rw-r--r-- 1 root root 7 3月 15 21:49 afile.da
可以看出果然是7字节。
4.9.9 读写文件数据块
C的I/O中提供了write和read函数分别从流中读取数据和向流写入数据。write函数是ostream的一个成员函数被ofstream继承。而read是istream的一个成员函数被ifstream继承。类fstream的对象同时拥有这两个函数。Write和read函数的原型是
ostream write ( char * buffer, streamsize size );istream read ( char * buffer, streamsize size );
这里buffer是一块内存的地址用来存储要写入或读出的数据。参数size是一个整数值表示要从buffer中读出或写入的字符数。
下面两个小例子演示了这两个函数的使用。
【例4.16】复制文件
1打开Visual Studio Code新建文本文件test.cpp输入代码如下
// 复制文件
#include fstream // std::ifstream, std::ofstreamint main() {std::ifstream infile(myfile.txt, std::ifstream::binary);std::ofstream outfile(new.txt, std::ofstream::binary);// 获取文件大小infile.seekg(0, infile.end);long size infile.tellg();infile.seekg(0);// 为文件内容分配内存char* buffer new char[size];// 读取infile的内容infile.read(buffer, size);// 向outfile写入内容outfile.write(buffer, size);// 释放动态分配的内存delete[] buffer;outfile.close();infile.close();return 0;
}2上传test.cpp到Linux在终端下输入命令g -o test test.cpp然后运行test运行结果如下
# g test.cpp -o test
# ./test
# cat new.txt
Linux
boy例4.17】读取文件到内存
1打开Visual Studio Code新建文本文件test.cpp输入代码如下
// 将文件读入内存
#include iostream // std::cout
#include fstream // std::ifstreamint main() {std::ifstream is(myfile.txt, std::ifstream::binary);if (is) {// 获取文件长度is.seekg(0, is.end);int length is.tellg();is.seekg(0, is.beg);char * buffer new char[length];std::cout Reading length characters... ;// 以块的形式读取数据is.read(buffer, length);if (is)std::cout all characters read successfully.;elsestd::cout error: only is.gcount() could be read;is.close();// 缓冲区包含整个文件内容delete[] buffer;}
}2上传test.cpp到Linux在终端下输入命令g -o test test.cpp然后运行test运行结果如下
# g test.cpp -o test# ./testReading 18 characters... all characters read successfully.