相关文章推荐

c++ fstream中seekg()和seekp()的用法

C++中seekp()和seekg()函数功能

seekp:设置输出文件流的文件流指针位置
seekg:设置输入文件流的文件流指针位置
函数原型:
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:搜索的起始位置
dir参数用于对文件流指针的定位操作上,代表搜索的起始位置
在ios中定义的枚举类型:
enum seek_dir {beg, cur, end};
每个枚举常量的含义:
ios::beg:文件流的起始位置
ios::cur:文件流的当前位置
ios::end:文件流的结束位置

tellg() ——返回一个int型数值,它表示“内置指针”的当前位置。此函数仅当你在读取一个文件时有效。例如:
#include <fstream.h>
void main()
{
// 假如我们已经在test_file.txt中存有了“Hello”的内容
ifstream File("test_file.txt")
char arr[10];
File.read(arr,10);
// 由于Hello占5个字符,因此这里将返回5
cout << File.tellg() << endl;
File.close();
}
tellp() —— 与tellg()有同样的功能,但它用于写文件时。总而言之:当我们读取一个文件,并要知道内置指针的当前位置时,应该使用tellg();当我们写入一个文件,并要知道内置指针的当前位置时,应该使用tellp(). 由于此函数的用法与tellg()完全一样,我就不给出示例代码了。
seekp() —— 还记得seekg()么?当我在读取一个文件,并想到达文件中某个特定位置时,就曾使用过它。seekp()亦如此,只不过它用于写入一个文件的时候。例如,假如我在进行文件读写,而要定位到当前位置的三个字符之前,则需调用FileHandle.seekg(-3). 但如果我是在写入一个文件,并且比如我要重写后5个字符的内容,我就必须往回跳转5个字符,因而,我应该使用FileHandle.seekp(-5) .
ignore() —— 使用于读取文件之时。如果你想略过一定数量的字符,只需使用此函数。实际上,你也可以使用seekg()来代替,然而使用ignore()有一个优点——你可以指定一个特定“界限规则(delimiter rule)”,同样使得ignore()在指定的位置停下。函数原型如下:
istream& ignore( int nCount, delimiter );
nCount表示要略过的字符数量,而delimiter —— 与它的名称有着同样的含义:假如你想在文件末尾停下,则可使用EOF值传入,这样一来此函数就等同于seekg();但该参数还可以使用其他值,例如‘\n’这样可以在换行的同时定位在新行处。下面是示例:
#include <fstream.h>
void main()
{
// 假设test_file.txt中已经存有"Hello World"这一内容
ifstream File("test_file.txt");
static char arr[10];
// 假如一直没有遇到字符"l",则向前定位直到跳过6个字符
// 而如果期间遇到"l",则停止向前,定位在该处
File.ignore(6,''l'');
File.read(arr,10);
cout << arr << endl; // 它将显示"lo World!"
File.close();
}
getline() —— 虽然前面的章节中我曾提到过这个函数,但还有一些内容我们未曾涉及:此函数不但可用于逐行读取,而且它还可以设为遇到某个特定字符后停止读取。下面给出传递这一参数的方法:
getline(array,array_size,delim);
以下为示例代码:
#include <fstream.h>
void main()
{
// 假设test_file.txt中已经存有"Hello World"这一内容
ifstream File("test_file.txt");
static char arr[10];

File.getline(arr,10,''o'');
cout << arr << endl; // 将显示"Hell"
File.close();
}
peek() —— 此函数将返回输入流文件的下一个字符,但它不移动内置指针。我想你该记得,像get()这样的函数也返回输入流文件的下一个字符,而与此同时它将移动内置指针。所以当你再次调用get()函数的时候,它会返回再下一个字符,而非前面那个。哦,使用peek()也会返回字符,但它不会移动“光标”。所以,假如你连续两次调用peek()函数,它会返回同一个字符。考虑以下代码:
#include <fstream.h>
void main()
{
// 假设test_file.txt中已经存有"Hello World"这一内容
ifstream File("test_file.txt");
char ch;
File.get(ch);
cout << ch << endl; // 将显示"H"
cout << char(File.peek()) << endl; //将显示"e"
cout << char(File.peek()) << endl; //将再次显示"e"
File.get(ch);
cout << ch << endl; // 还是显示"e"
File.close();
}
顺便说一下,我忘了讲——peek()函数实质上返回的是字符的ASCII码,而非字符本身。

c++ fstream中seekg()和seekp()的用法C++中seekp()和seekg()函数功能seekp:设置输出文件流的文件流指针位置seekg:设置输入文件流的文件流指针位置函数原型:ostream& seekp( streampos pos );ostream& seekp( streamoff off, ios::seek_dir dir );ist
本文主要总结用C++的fstream、ifstream、ofstream方法读写 文件 ,然后用 seekg ()、 seekp () 函数 定位输入、输出 文件 指针位置,用 tellg ()、 tellp ()获取当前 文件 指针位置。 一、核心类和 函数 功能讲解 fstream: 文件 输入输出类。表示 文件 级输入输出流(字节流); ifstream: 文件 输入类。表示从 文件 内容输入,也就是读 文件 ; ofstream: 文件 输...
tellg seekg tellg (), seekg () and seekp () functions are used to set/get the position of get and put pointers in a file while reading and writing. tellg () , seekg ()和 seekp () 函数 用于在读取和写入时设置/获取get和put指针在 文件 中的...
对输出流 操作 seekp ()与 tellp () 下面以输入流 函数 为例介绍用法: seekg ()是对输入 文件 定位,它有两个参数:第一个参数是偏移量,第二个参数是基地址。 对于第一个参数,可以是正负数值,正的表示向后偏移,负的表示向前偏移。而第二个参数可以是: ios::beg:表示输入流的开始位置 ios::cur:表示输入流的当前位置 解析wav格式,发现某个 文件 解析错误,调试发现,打开 文件 时, 文件 偏移是0,读取4字节后, 文件 偏移是3588,不知道为什么。 奇怪的是换成别的 文件 文件 偏移就正常,代码一模一样,只是换了个wav 文件 名。 使用c语言写了一遍,依然一样,换成qt后,读4个字节,偏移位置就是4,正常。 那么ftell和 tellg 到底是什么意思呢? 为什么对这个特定的 文件 会有这样的表现? 您好,想问问,char input; cin>>input; cout<<tolower(input)<<endl; //输入字母' A '时,想得到结束为' a ' , 实际结果却是65, 直接转换成int型输出; 如此输出结果原因? 60-思考题(1)-将1到9 这九个数字分成若干个数,满足一定的算式 m0_56747453: 啥原理都不讲吗 循环的应用---(1)判断输入是否合法,不合法要求重新输入(2)某项功能的循环执行 Deepturn: 前排支持一下
 
推荐文章