- python中eof表示什么语句错误
- python中for语句涉及的序列
- python中if是循环语句吗
- python中if语句与或非
通过前面章节的学习我们知道,无论是使用 cout 输出普通数据,用 cout.put() 输出指定字符,还是用 cout.write() 输出指定字符串,数据都会先放到输出流缓冲区,待缓冲区刷新,数据才会输出到指定位置(屏幕或者文件中)。
值得一提的是,当数据暂存于输出流缓冲区中时,我们仍可以对其进行修改。ostream 类中提供有
tellp() 和
seekp() 成员方法,借助它们就可以修改位于输出流缓冲区中的数据。
streampos tellp();
显然,tellp() 不需要传递任何参数,会返回一个 streampos 类型值。事实上,streampos 是 fpos 类型的别名,而 fpos 通过自动类型转换,可以直接赋值给一个整形变量(即 short、int 和 long)。 也就是说,在使用此函数时,我们可以用一个整形变量来接收该函数的返回值。在下面的样例中,实现了借助 cout.put() 方法向 test.txt 文件中写入指定字符,由于此过程中字符会先存入输出流缓冲区,所以借助 tellp() 方法,我们可以实时监控新存入缓冲区中字符的位置。注意,当输出流缓冲区中没有任何数据时,该函数返回的整形值为 0;当指定的输出流缓冲区不支持此操作,或者操作失败时,该函数返回的整形值为 -1。
#include <iostream> //cin 和 cout #include <fstream> //文件输入输出流 int main() { //定义一个文件输出流对象 std::ofstream outfile; //打开 test.txt,等待接收数据 outfile.open("test.txt"); const char * str = "http://c.biancheng.net/cplus/"; //将 str 字符串中的字符逐个输出到 test.txt 文件中,每个字符都会暂时存在输出流缓冲区中 for (int i = 0; i < strlen(str); i++) { outfile.put(str[i]); //获取当前输出流 long pos = outfile.tellp(); std::cout << pos << std::endl; } //关闭文件之前,刷新 outfile 输出流缓冲区,使所有字符由缓冲区流入test.txt文件 outfile.close(); return 0; }
读者可自行运行此程序,其输出结果为 1~29。这意味着,程序中每次向输出流缓冲区中放入字符时,pos 都表示的是当前字符的位置。比如,当将 str 全部放入缓冲区中时,pos 值为 29,表示的是最后一个字符 '/' 位于第 29 个位置处。注意,此例中涉及到了文件操作的相关知识,初学者仅需借助注释了解程序的执行脉络即可,不需要研究具体实现细节。有关文件操作,后续章节会做详细讲解。
http://c.biancheng.net/cplus/
借助 tellp() 方法得知,最后一个 '/' 字符所在的位置是 29。此时如果继续向缓冲区中存入数据,则下一个字符所在的位置应该是 30,但借助 seekp() 方法,我们可以手动指定下一个字符存放的位置。http://c.biancheng.net/python/
显然,新的 "python/" 覆盖了原来的 "cplus/"。//指定下一个字符存储的位置 ostream& seekp (streampos pos); //通过偏移量间接指定下一个字符的存储位置 ostream& seekp (streamoff off, ios_base::seekdir way);其中,各个参数的含义如下:
模式标志 | 描 述 |
---|---|
ios::beg | 从文件头开始计算偏移量 |
ios::end | 从文件末尾开始计算偏移量 |
ios::cur | 从当前位置开始计算偏移量 |
cout.seekp(23) << "当前位置为:" << cout.tellp();举个例子:
#include <iostream> //cin 和 cout #include <fstream> //文件输入输出流 using namespace std; int main() { //定义一个文件输出流对象 ofstream outfile; //打开 test.txt,等待接收数据 outfile.open("test.txt"); const char * str = "http://c.biancheng.net/cplus/"; //将 str 字符串中的字符逐个输出到 test.txt 文件中,每个字符都会暂时存在输出流缓冲区中 for (int i = 0; i < strlen(str); i++) { outfile.put(str[i]); //获取当前输出流 } cout << "当前位置为:" << outfile.tellp() << endl; //调整新进入缓冲区字符的存储位置 outfile.seekp(23); //等价于: //outfile.seekp(23, ios::beg); //outfile.seekp(-6, ios::cur); //outfile.seekp(-6, ios::end); cout << "新插入位置为:" << outfile.tellp() << endl; const char* newstr = "python/"; outfile.write("python/", 7); //关闭文件之前,刷新 outfile 输出流缓冲区,使所有字符由缓冲区流入test.txt文件 outfile.close(); return 0; }读者可自行执行此程序,会发现最终 test.txt 文件中存储的为 "http://c.biancheng.net/python/"。
在这个程序中我想改变文件中的一些值。现在我以附加模式打开文件并将我的 seekp 指针移动到我给定的位置。但问题是它在文件末尾写入数据而不是那里有 seekp 指针。 #include #includ
我在以二进制模式替换文件的一部分时遇到了一些问题。出于某种原因,我的 seekp() 行没有将文件指针放在所需位置。现在它将新内容附加到文件末尾,而不是替换所需的部分。 long int pos; b
执行以下代码后文件的内容应该是什么 int main (int, char**) { std::string s1 {"Hello world"}; std::string s2 {"
如果我在文件末尾执行 seekp 然后 write 会发生什么?我希望发生的是该文件会自动扩展到 seekp 位置的大小。如果是这样,它是否也通过向磁盘写入任何内容来填充文件的旧末尾和新位置之间的空间
以下代码适用于双向流并从文件中查找记录 ID,然后从文件中替换该记录的内容。但是在覆盖内容之前,它会将 put 指针移动到 get 指针的位置。通过tellp()和tellg()发现它们在移位前都已经
我正在尝试使用 C++ 在文件的特定位置写入条目 基本上我有 ofstream ofs("file.dat", ios::binary | ios::app); ofs.seekp(220, ios:
编辑,抱歉,这个问题显然与 failbit not being set when seekg seeks past end of file (C++,Linux) 重复 要到达我所在的位置,首先在终端
每当我想将位置设置为 X tellp return -1 时,fstream 中的 seekp() 有一个小问题。 代码: fstream file("Riot.exe", ios::in | ios
这个程序应该创建一个名为 Record.bin 的二进制文件,然后将用户输入的所有信息写入该文件。现在它到达了它在 Student B[10] 中读取的部分,并且它正确读取了 B[0],但是 B[]
我用 C++ 编写了以下代码,将 Student 对象写入文件,然后使用 seekp() 将输出指针移动到特定位置,在该位置我编写了一个 Student 对象,该对象替换了该位置的先前对象,并保留了其
我有以下代码: #include #include #include using namespace std; int main() { fstream in("test.txt");
我正在尝试写入以将数据追加到文件末尾,并且正在使用 seekp(streamoff off, ios_base::seekdir dir) 函数但它不追加,不知何故它在中间写入数据的文件。我尝试像这样
描述:我有一个包含几行的文本文件,我想在两行之间写入。 我尝试了什么: 我有一个循环来确定我想写的位置。当我尝试打开文件时,使用 seekp 定位输入,然后写入文件被截断。 示例 文件.txt: He
我刚刚注意到,通过“seekp”在 microsoft visual studio 中更改位置,我在处理文件时也隐含地更改了读取位置。 我想知道这是否是“可移植”行为?我可以期望阅读和写作的位置始终相
为我糟糕的英语道歉。我被 C++ 中的 fstream 困住了。这是我的代码。 #include #include using namespace std; struct TestStruct {
我创建了一个类 Student。 学生类: class Student { friend ostream& operator(&s), sizeof(s)); return s
我在 Debian x64 PC 上运行的 c++ 程序有一个奇怪的行为。 我无法设法先读取文件,然后写入另一个值,然后再读取这些值。我已经阅读了很多信息,包括关于 stackoverflow 的问题
我正在编写一个方法来替换二进制文件中的指定字符串,它在我用 seekp 设置的位置之前写入 NULL,然后写入字符串并关闭流。我只想替换文件中的一些字节。在这段代码之前,我尝试使用带有 ios::bi
一位面试官问我如何实现 tail(是的,linux shell 中的那个)。我的回答是,先寻找到文件的末尾,然后一个接一个地向前读取字符,如果遇到 \n,则表示一行已关闭,等等。我认为我的答案是正确的
我正在寻找一些关于 seekg() 和 seekp() 在写入文件时如何工作的说明。比如说我有一个像这样的文件: offset 0: 2 offset 4: 4 offset 8: 6 offset
我是一名优秀的程序员,十分优秀!