std::istream 中的跳过行

发布于 2024-08-27 09:37:19 字数 81 浏览 6 评论 0原文

我正在使用 std::getline() 从 std::istream 派生类读取行,如何向前移动几行?

我是否必须阅读并丢弃它们?

I'm using std::getline() to read lines from an std::istream-derived class, how can I move forward a few lines?

Do I have to just read and discard them?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

赠我空喜 2024-09-03 09:37:19

不,你不必使用 getline

更有效的方法是使用 std::istream::ignore 忽略字符串

for (int currLineNumber = 0; currLineNumber < startLineNumber; ++currLineNumber){
    if (addressesFile.ignore(numeric_limits<streamsize>::max(), addressesFile.widen('\n'))){ 
        //just skipping the line
    } else 
        return HandleReadingLineError(addressesFile, currLineNumber);
}

HandleReadingLineError 不是标准的,而是手工制作的,当然。
第一个参数是要提取的最大字符数。如果这正是 numeric_limits::max(),则没有限制:
链接位于 cplusplus.com:std::istream::ignore

如果您要跳过很多内容你绝对应该使用它而不是 getline:当我需要跳过文件中的 100000 行时,它花费了大约一秒的时间,而使用 getline 则需要 22 秒。

No, you don't have to use getline

The more efficient way is ignoring strings with std::istream::ignore

for (int currLineNumber = 0; currLineNumber < startLineNumber; ++currLineNumber){
    if (addressesFile.ignore(numeric_limits<streamsize>::max(), addressesFile.widen('\n'))){ 
        //just skipping the line
    } else 
        return HandleReadingLineError(addressesFile, currLineNumber);
}

HandleReadingLineError is not standart but hand-made, of course.
The first parameter is maximum number of characters to extract. If this is exactly numeric_limits::max(), there is no limit:
Link at cplusplus.com: std::istream::ignore

If you are going to skip a lot of lines you definitely should use it instead of getline: when i needed to skip 100000 lines in my file it took about a second in opposite to 22 seconds with getline.

长伴 2024-09-03 09:37:19

编辑:您还可以使用 std::istream::ignore,请参阅 https://stackoverflow.com/ a/25012566/492336


我必须使用 getline 来获取我想要跳过的行数吗?

不,但对于那些阅读您的代码的人来说,这可能是最清晰的解决方案。如果您要跳过的行数很大,您可以通过读取大块并计算每个块中的换行符、停止文件并将文件重新定位到最后一个换行符的位置来提高性能。但除非您遇到性能问题,否则我只是将 getline 放入循环中以获得您想要跳过的行数。

Edit: You can also use std::istream::ignore, see https://stackoverflow.com/a/25012566/492336


Do I have to use getline the number of lines I want to skip?

No, but it's probably going to be the clearest solution to those reading your code. If the number of lines you're skipping is large, you can improve performance by reading large blocks and counting newlines in each block, stopping and repositioning the file to the last newline's location. But unless you are having performance problems, I'd just put getline in a loop for the number of lines you want to skip.

好菇凉咱不稀罕他 2024-09-03 09:37:19

是的,使用 std::getline 除非您知道换行符的位置。

如果由于某种奇怪的原因您碰巧知道换行符出现的位置,那么您可以首先使用 ifstream::seekg 。

您可以通过其他方式读取,例如 ifstream::read ,但 std::getline 可能是最简单、最清晰的解决方案。

Yes use std::getline unless you know the location of the newlines.

If for some strange reason you happen to know the location of where the newlines appear then you can use ifstream::seekg first.

You can read in other ways such as ifstream::read but std::getline is probably the easiest and most clear solution.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文