使用char *而不是字符串c ++逐行读取文本文件

时间:2012-04-01 11:50:32

标签: c++

我有下一个代码:

  std::string line;
  std::ifstream myfile ("text.txt");
  if (myfile.is_open())
  {
    while ( myfile.good() )
    {
      getline (myfile,line);
      std::cout << line << std::endl;
    }
    myfile.close();
  }

有没有办法做到这一点,并使用char *代替字符串?

2 个答案:

答案 0 :(得分:5)

是的,如果你真的坚持的话。 getline的{​​{1}}版本会成为std::istream的成员:

char buffer[1024];

std::ifstream myfile("text.txt");

while (myfile.getline(buffer, sizeof(buffer))
    std::cout << buffer << "\n";
myfile.close();

但是,请注意,大多数C ++程序员最多会认为这是过时的。哦,为了记录,你问题中的循环也不是真的正确。使用字符串,您通常需要以下内容:

std::string line;
std::ifstream myfile("text.txt");

while (std::getline(myfile, line))
    std::cout << line << "\n";
myfile.close();

或者,您可以使用my previous answers之一的line代理,在这种情况下,它会变得更简单:

std::copy(std::istream_iterator<line>(myfile),
          std::istream_iterator<line>(),
          std::ostream_iterator<std::string>(std::cout, "\n"));

答案 1 :(得分:3)

所以你正在寻找一个更像&#34; C-like&#34;溶液

#include<cstdio>
#define ENOUGH 1000

int main() {

    char buffer[ENOUGH];

    FILE* f = fopen("text.txt", "r");
    while (true) {
       if (fgets(buffer, ENOUGH, f) == NULL) break;
       puts(buffer);
    }
    fclose(f);

    return 0;
}

...加上一些检查文件是否正确打开。在这种情况下,您在文件fgets()上使用f,并阅读char * buffer。但是,缓冲区仅分配了ENOUGH空间,此限制也是fgets()函数的重要参数。当达到ENOUGH - 1个字符时,它将停止读取该行,因此您应该确保ENOUGH常量足够大。

但是,如果你并不想在一个类似于C的&#34;中解决这个问题。方式,但仍然会使用<iostream>,那么您可能只想知道c_str() std::string方法返回char* std::string的{​​{1}}表示