gpt4 book ai didi

C++使用ifstream读取文件

转载 作者:行者123 更新时间:2023-12-02 01:44:32 32 4
gpt4 key购买 nike

我对使用 std::ifstream 有一些疑问在 C++ 中。

大多数都是我无法找到答案的一般性问题,因此可能对其他人也有用。

无论如何,我使用 #include <fstream>并创建了一个变量 char line[20] .

有一个文本文件,其中包含多行模式 jxxx (其中 x 是数字),如下所示:

j1234j5678j1111(and so on)

So, I do this:

#include <iostream>
#include <fstream>

char line[20]
ifstream rfile;
rfile.open("path-to-txt-file");
while (!rfile.eof()) {
rfile.getline(line, 20); (why is 20 needed here?)
cout >> data >> endl;
}
rfile.close();

所以担忧的是:

  1. 为什么 getline 中需要这个数字方法?

  2. line\0最后自动?因为当我们创建char时变量如char text[5]; text = "abc1" ,实际上保存为"acd1\0"以及每个 \n 之后文件 ( jxxx ) 中的尾行会发生什么情况线? (我想在比这更复杂的代码中使用这些行,所以想知道)

  3. 程序会自动移到下一行吗?如果没有,我如何告诉它转到下一行?

最佳答案

  1. 您正在调用 std::ifstream::getline() ,需要 char*指向输出缓冲区的指针。 getline()要求您指定该缓冲区的最大大小,这样它就不会溢出。如果您想处理可变长度的行而不用担心溢出,您应该更改 linestd::string并使用 std::getline() 相反。

  2. 如果成功,std::ifstream::getline()将以空终止输出缓冲区。这意味着最多 getline()读取的大小将比请求的最大大小小 1,因此请确保在传入的大小中包含空终止符的空间(如果遇到换行符或 EOF,getline() 可能会读取更少的空间)。至于换行符本身,它们被getline()吞没了。 ,它们不会出现在缓冲区中。

  3. 是的,代码会自动移至下一行,因此您可以继续调用 getline()循环中。

附注:

  • while (!rfile.eof()) is bad to use 。使用while (rfile)反而。或者更好,while (rfile.getline(line, 20)) 。无论哪种方式都会解释 open() 中发生的任何错误。和getline() ,但后者确保 cout如果 getline() 则不会被调用失败。

  • cout >> data >> endl;也是错误的。您需要使用<<std::cout ,和data应该是line相反。

试试这个:

#include <iostream>
#include <fstream>

char line[20];
std::ifstream rfile;
rfile.open("path-to-txt-file");
if (rfile.is_open()) {
while (rfile.getline(line, 20)) {
std::cout << line << std::endl;
}
rfile.close();
}

或者这个:

#include <iostream>
#include <fstream>
#include <string>

std::string line;
std::ifstream rfile;
rfile.open("path-to-txt-file");
if (rfile.is_open()) {
while (std::getline(rfile, line)) {
std::cout << line << std::endl;
}
rfile.close();
}

关于C++使用ifstream读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46719183/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com