Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;ifstream读取偏移范围_C++ - Fatal编程技术网

C++ C++;ifstream读取偏移范围

C++ C++;ifstream读取偏移范围,c++,C++,我工作的一个文件,在这个文件的内容:“你好,这里的家伙”。如何仅读取“READHERE”位置 我尝试此代码但失败: 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

我工作的一个文件,在这个文件的内容:“你好,这里的家伙”。如何仅读取“READHERE”位置

我尝试此代码但失败:

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.
}
std::ifstream是(“test.txt”);
如果(is.good())
{
is.seekg(5,ios::end);//从末尾开始的步骤“\u伙计们”
is.seekg(6,ios::beg);//从“hello_”开始的步骤
std::字符串数据;
而(是>>数据){}
std::cout只设置要从输入流中提取的下一个字符的位置。它不能设置停止的“限制”。因此,下面一行:

is.seekg(5, ios::end); // step from end "_guys"
不正确。将seekg与
ios::end
一起使用不会设置限制

但是,您的另一个用法是正确的。如果您只想读取特定的数据块,并且如果您准确地知道该数据块的大小(“READHERE”字符串的精确大小),则可以使用该函数来读取它:

std::ifstream is("test.txt");

if (is.good())
{
    is.seekg(5, ios::end); // step from end "_guys"


    std::string data(sizeof("READHERE"), '\0'); // 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".
}
std::ifstream是(“test.txt”);
如果(is.good())
{
is.seekg(5,ios::end);//从末尾开始的步骤“\u伙计们”
std::string data(sizeof(“READHERE”),“\0”);//初始化适当长度的字符串。
is.read(&data[0],sizeof(“READHERE”);//读取单词并将其存储到字符串中。

std::cout当您第一次调用
seekg
时,它会在文件中的指定位置设置一个“游标”。然后在您第二次调用
seekg
后,它会将该“游标”设置在另一个位置(现在在“head”之后),但它不关心以前的调用,因此不会像您想象的那样读取

一种解决方案如下:

std::string data;
is.ignore(std::numeric_limits<std::streamsize>::max(), '_');
std::getline(is, data, '_');
std::字符串数据;
is.ignore(std::numeric_limits::max(),''u');
std::getline(is,data,'.');

用于跳过所有内容,直到并包括第一次出现''.''。现在从该文件读取所有内容(在跳过部分之后),直到遇到作为第三个参数提供的字符分隔符(
'.'
)因此,它可以准确地读取您想要的内容。

您可能应该阅读
seekg
的文档。它没有定义“范围”,它只移动读取位置。我读取了文档,并尝试不工作。请帮帮我。Windows api ReadFile函数提供nNumberOfBytesToRead。对于ifstream,我应该做什么?指针OrawData和SizeOfRawData大小在那里。您在这里试图实现什么,您是否打算基于hello_u和u家伙读取和解析数据?为什么不调整大小
数据
并直接读入?无需通过
缓冲区
和类似C的函数进行往返。事实上,您根本没有使用
数据
。@LightnessRacesinOrbit您是对的,我以前的解决方案太C风格了。我用
std::string
取代了它。