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>>数据>>结束也是错误的。您需要使用
      
      
    • 您提供的数字是要读取的最大字符数
    • 正在使用的ifstream.getline中的最后一个字符是\0
    • 它将在达到字符数或换行时返回
    • 听起来您需要像getline(stream,&string,delemiter)一样使用getline函数,所以在您的例子中

      std::string buff;
      getline( rfile, buff )
      
      这将读取文件,直到找到换行符,并将字符串(减去换行符)存储在buff中

    • getline()函数将指向字符的指针作为参数,它无法知道数组有多大,这就是为什么必须自己传递数字,否则它可能会尝试将字符读入数组“外部”的内存中

    • 默认情况下,字符数组不是以null结尾的,它们必须显式终止(就像getline()在这里所做的那样),但只有当您想将字符数组用作字符串时才需要它。通过这种方式,您可以编写一些以char*为参数的函数,而不需要使用数组大小的附加参数,这样即使调用方没有像代码中的getline()那样传递字符串大小,您也会知道当遇到0时字符串的结尾在哪里。这就是c风格字符串背后的想法

    • <代码>为什么这里需要20?< /C> >因为不是使用C++字符串(STD::String),而是使用C字符串。<代码>((.rFr.Eff)){< /Cord> >不需要测试<代码>(R.Fr.IsAsOn())
      --如果流未打开,读取将失败。并且无需关闭文件;析构函数将执行此操作。@PeteBecker:我知道。OP的问题显式调用
      close()
      ,因此在
      open()时选中
      is_open()
      失败。是的,
      ifstream
      析构函数关闭文件,但直到
      ifstream
      超出范围。在此之前,允许用户显式地
      close()
      。从文件读取后,可能会有更多代码,使
      ifstream
      在范围内保留更长时间。最好
      close()
      ifstream在处理完文件后(我个人认为,在这种情况下,我会将
      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 )