我有一个问题,在我循环一个文件并用计数器提取几个字母以知道已经提取了多少个字符后,如何重新定位我的指针以指向提取的第一个字符。这是我到目前为止所尝试的:
int get_length(ifstream &inp,int &length){
int columns=0;
inp>>columns;
length++;
while(columns!=0)
{
inp>>columns;
length++;
}
if (!inp.good())
inp.clear();
inp.seekg(-length,std::ios::cur);
return length;
}
由于某种原因,它不会回到相同的长度,它是一个错误,我已经尝试增加一个长度然后写那个搜索功能我不知道这里有什么问题,我正在寻求,如果我'错误地使用了搜索功能?
答案 0 :(得分:0)
我认为问题是这样的: 每次从fstream'int'读取整数值时,您都在递增'length'。根据整数表示的宽度,您将需要增加该数量的长度。那个和新行的字符以及fstream中的任何其他空格。
如果您的测试数据包含:
10
11
12
13
然后,在您阅读13时,您将消耗12个字节的文件数据。 你的计数器只会增加4倍。
通过拨打
,您可以更轻松,更准确地完成此操作auto const position_start = inp.tellg();
在您的功能开始时,一旦您通过调用
读取您感兴趣的数据'倒回'到起始位置inp.seekg(position_start, std::ios::beg);
答案 1 :(得分:0)
' ifstream的'是' basic_ifstream'的特化,所以' ifstream :: seekg()'获取以字节为单位的偏移量(字符)。但是,格式化的输入(到int)将使当前位置前进一定数量的字节(0或更多),因为它将输入转换为整数值。使用' ifstream :: tellg()'在函数顶部获取当前文件位置,另一次调用' tellg()'在致电' seekg()'之前获取新文件位置。这两个值的差异将是'长度'