C++ 从c++;

C++ 从c++;,c++,file,io,C++,File,Io,因此,我找到了我想要读取的文件的特定行,但我得到的行不通: string str; int target = 0; ifstream record; record.open("Record.txt"); target = std::count(std::istreambuf_iterator<char>(record), std::istreambuf_iterator<char>(), '\n') - 8; cout << target <&

因此,我找到了我想要读取的文件的特定行,但我得到的行不通:

    string str;
int target = 0;
ifstream record;

record.open("Record.txt");
target = std::count(std::istreambuf_iterator<char>(record), std::istreambuf_iterator<char>(), '\n') - 8;
cout << target << endl;

for(int lineNum = 0; lineNum <= target; lineNum++)
{
    getline(record, str);
    if(lineNum == target)
    {
        cout <<"the id: "<< str << endl;
    }
}

有人能指出我做错了什么或给我一些提示吗?谢谢

在调用
std::count()
之后,
记录流将
eof()
,但代码从不检查
std::getline()
的返回值,因此不知道它失败:始终检查读取操作的返回值。这意味着永远不会填充
str
,因此在
“thid id:”
消息之后不会打印任何内容


您需要重置流或重新打开它。

在调用
std::count()
之后,
记录流将是
eof()
,但代码从不检查
std::getline()
的返回值,因此不知道它失败:始终检查读取操作的返回值。这意味着永远不会填充
str
,因此在
“thid id:”
消息之后不会打印任何内容


您需要重置流或重新打开它。

如果您正在读取的文件末尾有空行,该怎么办?即使更正了代码,您也要遍历文件两次。这是相当缓慢和不必要的。只要有一个最后八行读取的缓冲区,一旦你点击EOF,只保留缓冲区的第一行。按照我创建文件的方式,它永远不会:)如果你正在读取的文件末尾有空行怎么办?即使在更正代码后,你也要遍历文件两次。这是相当缓慢和不必要的。只要有一个最后八行的缓冲区,一旦你点击EOF,只保留缓冲区的第一行。我创建文件的方式,它永远不会:)史诗!真不敢相信我忘了重置流。非常感谢@SantasNotReal,如果您不想再次读取文件,您可以始终使用大小为8的
队列。您可以使用的逻辑是不断将行推送到
队列
,直到大小小于8,否则弹出并推送。在阅读了一次文件后,您的目标行位于顶部。@Vikas对于这个项目,我现在不太担心效率,而不是获得一个有效的迭代。我知道文件大小总是“相对”小,但这是提高效率的好主意。我肯定会在下一次迭代中这样做。史诗!真不敢相信我忘了重置流。非常感谢@SantasNotReal,如果您不想再次读取文件,您可以始终使用大小为8的
队列。您可以使用的逻辑是不断将行推送到
队列
,直到大小小于8,否则弹出并推送。在阅读了一次文件后,您的目标行位于顶部。@Vikas对于这个项目,我现在不太担心效率,而不是获得一个有效的迭代。我知道文件大小总是“相对”小,但这是提高效率的好主意。我肯定会在下一次迭代中这样做。
14
the id: