C++ifstream读取偏移范围
C++ ifstream read offset range
我处理一个文件,在这个文件内容中:"hello_READHERE_guys"。如何只阅读"阅读"位置?
我尝试了这段代码并失败了:
std::ifstream is("test.txt");
if (is.good())
{
is.seekg(5, ios::end); // step from end "_guys"
is.seekg(6, ios::beg); // step from start "hello_"
std::string data;
while (is >> data) {}
std::cout << data << std::endl; // output "READHERE_guys" fail.
}
seekg 函数仅设置要从输入流中提取的下一个字符的位置。它不能设置停止的"限制"。所以下面的行:
is.seekg(5, ios::end); // step from end "_guys"
不正确。将 seekg 与 ios::end
一起使用不会设置限制。
但是,您的其他用法是正确的。如果你只想读取一个特定的数据块,并且如果你确切地知道这个数据块的大小(字符串"READHERE"的精确大小),你可以使用 istream::read 函数来读取它:
std::ifstream is("test.txt");
if (is.good())
{
is.seekg(5, ios::end); // step from end "_guys"
std::string data(sizeof("READHERE"), ' '); // Initialize a string of the appropriate length.
is.read(&data[0], sizeof("READHERE")); // Read the word and store it into the string.
std::cout << data << std::endl; // output "READHERE".
}
当您第一次调用seekg
时,它会在文件中的指定位置设置一个"光标"。然后在你第二次调用seekg
后,它会将该"curson"设置为另一个位置(现在在"head_"之后),但它不关心之前的调用,所以它不会像你想象的那样阅读。
一种解决方案是作为 folows:
std::string data;
is.ignore(std::numeric_limits<std::streamsize>::max(), '_');
std::getline(is, data, '_');
std::ifstream::ignore
用于跳过所有内容,直到并包括第一次出现"_"。现在std::getline
从该文件中读取所有内容(当然在跳过部分之后),直到遇到作为第三个参数('_'
)提供的字符分隔符,因此它将准确读取您想要的内容。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 为什么在全局范围内使用"extern int a"似乎不行?
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 尝试通过多个向量访问变量时,向量下标超出范围
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 读取互斥对象范围之外的volatile变量,而不是std::atomic
- 从文件中读取选定的行范围并存储到数组中
- 读取矢量时矢量下标超出范围
- C++ 从指定范围内的文件中读取数组
- 将文件读取到向量的向量,超出范围错误
- AWS S3 CPP SDK读取字节多于指定的范围
- C++ifstream读取偏移范围
- 从TextFile中读取数字,并检查它们是否在范围内
- Boost.python 将对象拉取到本地范围内以进行读取访问
- 这段代码有什么问题?我无法从文件中读取矢量。表达式:矢量下标超出范围
- 速度控制在100Hz至10KHz范围内读取小记录从文件上的窗口
- 仅读取文本文件中特定范围的行
- 识别posix读取暂停在微秒范围内