创建一个读取的程序计算C ++文件中的行数

时间:2014-01-27 20:36:55

标签: c++ file fstream

我想要计算代码中的行数我已经想到我需要从文件中查找特定字符,并在每次找到它时递增1。现在我有一个普遍的要点,但我很难弄清楚如何读取文件中的每一行。我已经发布了迄今为止的内容。任何帮助将不胜感激

#include<fstream>
#include <iostream>

using namespace std;

 int main()
{
   ifstream readfile;
   readfile.open("project1b.cbp");
   int number_of_lines=0;
   char = ch;
   while(ch !=EOF)
   {
       if(ch!='endl'||';')
        number_of_lines++;
   }


    return 0;
}

3 个答案:

答案 0 :(得分:2)

该行

   if(ch!='endl'||';')

不按你的想法行事。您正在检查ch是否等于endl,还是;。由于;始终为真(非零),因此您在这里并没有真正有用的比较。

你可能会想到

   if(ch!='endl'|| ch!=';')

或类似的东西。不确定你想要通过比较实现什么......

至于你问题的另一部分 - 排名靠前的谷歌&#34; C ++逐行读取文件&#34;引导您进入以下stackoverflow答案:

https://stackoverflow.com/a/7868998/1967396

这就是你所需要的一切。

还有一件事 - 您需要为自己更清楚地定义一行&#34;代码行&#34;是。基本上是&#34;任何回车,或任何分号&#34;新线?分号后跟新行怎么样?有两个分号的行(一行有两个语句)怎么样?

要清除你的想法,你需要更多的困惑。我建议你将逻辑分成

  1. 从文件中获取一行
  2. 计算分号
  3. 如果有分号,那么还有其他注意事项
  4. 决定如何计算这些
  5. 最后的想法:单引号' '用于定义字符常量。双引号" "用于定义字符串常量。行尾字符通常为\n\r;在C ++中,我们使用std::endl作为编写它的方式 - 但它不在引号中。当您使用namespace std时,您可以在endl时写下'\n'。但是在它周围加上单引号会让我感到困惑 - 也可能是编译器。

答案 1 :(得分:0)

您可以使用std::getline获取每一行。

答案 2 :(得分:0)

试试这个:

#include <fstream>
#include <iostream>
using namespace std;

int main(int argc, char **argv){
  if(argc!=2){
    cout<<"Syntax: "<<argv[0]<<" <FILENAME>"<<endl;
    return -1;
  }

  ifstream readfile(argv[1]);
  if(!readfile.good()){
    cout<<"Failed to open file: '"<<argv[1]<<"'!"<<endl;
    return -1;
  }

  int number_of_lines=0;
  while(readfile.good()){
    char ch=readfile.get();
    if(ch=='\n'|| ch==';')
      number_of_lines++;
  }

  cout<<"Number of lines: "<<number_of_lines<<endl;

  return 0;
}

与您的代码存在一些差异。

  • 我使用argc and argv,以便用户可以在命令行上指定文件名。
  • 我使用ifstream readfile(argv[1])加载文件。这符合C ++中常用的RAII(资源获取是初始化)方案。我不使用close()语句,因为ifstream将超出范围并自动清理自己。使用RAII可以使您的代码更清晰,更不容易出错。
  • 我使用get()从字符流中获取新字符。您的代码中缺少这个。
  • \n(换行符)字符是我们当前正在查看的字符时,或者我们正在查看;字符时,会出现该行的结尾。 endl不是一个字符常量 - 它更像是一个流操作符 - 所以你不能以你的方式使用它,也不能一般地比较这种类型。
  • 请注意,或运算符(||)除以两个完整的逻辑语句,您使用它的方式((ch!='endl'||';'))不会像您认为的那样工作。
  • 我选择使用K&R style支撑而不是你的异教徒Allman/GNU style。 (这是一个笑话,但我鼓励你尝试几种不同的风格并找到适合你的风格。我更喜欢K&amp; R for SO,因为代码更紧凑。

你应该问问自己这是否真的是你想要计算代码行的方式。例如,for构造(for(int i=0;i<N;++i))最终会使用您的指标看起来像三行代码。