C++ C++;使用ifstream读取文件 >数据>>结束; } rfile.close();
大多数是我找不到答案的一般性问题,所以可能对其他人也有用 总之,我使用了C++ C++;使用ifstream读取文件 >数据>>结束; } rfile.close();,c++,C++,大多数是我找不到答案的一般性问题,所以可能对其他人也有用 总之,我使用了#include并创建了一个变量字符行[20] 有一个文本文件,它有多行模式jxxx(其中xs是数字),如下所示: j1234 j5678 j1111 (and so on) j1234 j5678 j1111 (等等) 因此,我这样做: #include <iostream> #include <fstream> char line[20] ifstream rfile; rfile.open("
#include
并创建了一个变量字符行[20]
有一个文本文件,它有多行模式jxxx
(其中x
s是数字),如下所示:
j1234
j5678
j1111
(and so on)
j1234
j5678
j1111
(等等)
因此,我这样做:
#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();
#包括
#包括
字符行[20]
ifrfile;
打开(“到txt文件的路径”);
而(!rfile.eof()){
rfile.getline(第20行);(为什么这里需要20?)
cout>>数据>>结束;
}
rfile.close();
因此,人们关注的是:
getline
方法中需要数字行
的末尾是否自动有\0
?因为当我们创建char
vars时,比如chartext[5];text=“abc1”
,它实际上保存为“acd1\0”
,并且在每个jxxx
行之后,文件(\n
)中的结束行会发生什么变化?(我想在比这更复杂的代码中使用这些行,所以我想知道)char*
指针进行输出getline()
要求您指定该缓冲区的最大大小,这样它就不会溢出。如果希望在不担心溢出的情况下处理可变长度的行,则应将line
更改为std::string
,并改用std::ifstream::getline()
将以null终止输出缓冲区。这意味着,getline()
读取的值最多比请求的最大值小1,因此请确保在传入的大小中包含空终止符的空间(getline()
如果遇到换行或EOF,则读取的值可能会更少)。至于换行符本身,它们被getline()
吞没,它们不会出现在缓冲区中getline()
。改用而(!rfile.eof())
。或者更好,while(rfile)
。任何一种方法都将解释在while(rfile.getline(line,20))
和open()
中发生的任何错误,但后者确保在getline()
失败时不会调用getline()
cout
cout>>数据>>结束代码>也是错误的。您需要使用
--如果流未打开,读取将失败。并且无需关闭文件;析构函数将执行此操作。@PeteBecker:我知道。OP的问题显式调用- 您提供的数字是要读取的最大字符数李>
- 正在使用的ifstream.getline中的最后一个字符是\0
- 它将在达到字符数或换行时返回
听起来您需要像getline(stream,&string,delemiter)一样使用getline函数,所以在您的例子中
这将读取文件,直到找到换行符,并将字符串(减去换行符)存储在buff中std::string buff; getline( rfile, buff )
- getline()函数将指向字符的指针作为参数,它无法知道数组有多大,这就是为什么必须自己传递数字,否则它可能会尝试将字符读入数组“外部”的内存中李> 看
- 默认情况下,字符数组不是以null结尾的,它们必须显式终止(就像getline()在这里所做的那样),但只有当您想将字符数组用作字符串时才需要它。通过这种方式,您可以编写一些以char*为参数的函数,而不需要使用数组大小的附加参数,这样即使调用方没有像代码中的getline()那样传递字符串大小,您也会知道当遇到0时字符串的结尾在哪里。这就是c风格字符串背后的想法
<代码>为什么这里需要20?< /C> >因为不是使用C++字符串(STD::String),而是使用C字符串。<代码>((.rFr.Eff)){< /Cord> >不需要测试<代码>(R.Fr.IsAsOn())
,因此在close()
open()时选中
失败。是的,is_open()
析构函数关闭文件,但直到ifstream
超出范围。在此之前,允许用户显式地ifstream
。从文件读取后,可能会有更多代码,使close()
在范围内保留更长时间。最好ifstream
ifstream在处理完文件后(我个人认为,在这种情况下,我会将close()
包装在它自己的范围内)。我的回答中没有假设。ifstream
#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(); }
std::string buff; getline( rfile, buff )