【问题标题】:"No newline at end of file" warning, even after putting in a newline [closed]“文件末尾没有换行符”警告,即使在输入换行符后也是如此[关闭]
【发布时间】:2011-10-12 04:39:22
【问题描述】:

我最近一直在努力学习 C++,直到今天一切顺利。我正在尝试制作一个非常简单的应用程序,基本上只是询问用户一个数字,然后显示该数字的阶乘。

当我尝试在 Cygwin (g++ factorial.cpp -o fact) 中编译文件时,我收到以下警告“警告:文件末尾没有换行符”。按照警告的内容,我在文件末尾添加了一个换行符并再次尝试......结果完全相同。无论我尝试一个换行符还是二十个换行符,它似乎都无法编译。

我在下面附上了一个简单但仍未完成的文件(除非想象它的末尾有一个空行。这个菜鸟无法让它显示在代码视图中):

   #include <iostream>
   #include <string>

    using namespace std;

    int getInput();
    void displayFactorial(int);

    int main()
    {
        int number = getInput();
        displayFactorial(number);
        return 0;

    }



    int getInput()
    {

        int userNumber;
        bool okNumber;

        while(okNumber == false){
            cout << "Please eneter a number in the range of 1-10";
            cin >> userNumber;
            if(userNumber >= 1 and userNumber <=10){
                okNumber = true;
            }
            else{
                cout << "Incorrect number" << endl;
            }
        }
        return userNumber;
    }

        void displayFactorial(int number){
            string displayString = number + "! =";
            int total;

            for(int i = 0; i<=number; i++){
                //displayString += "
            }

            cout << displayString;

        }

// File ended the line above this (with a new line. This line added by Martin so it shows)

知道如果不是换行符会导致该警告的原因吗?

【问题讨论】:

  • 不确定是什么导致了警告,但在您(尝试)进入循环之前,您没有将okNumber 初始化为“假”,因此while 循环可能永远不会运行。哦,也许这意味着你不要在displayFactorial()末尾做&lt;&lt; endl
  • 你在重新编译之前保存了文件吗?
  • @Rudy Velthuis:缺少&lt;&lt; endl 不可能是原因。见This。此外,如果我改用 \n 会怎样?
  • @Mr.T:我胡乱猜测。 我这里没有安装 Cygwin 编译器。
  • FWIW,你有评论//displayString += "。这也是函数中的注释,还是代码?看起来像一个未终止的字符串文字。

标签: c++ cygwin warnings newline


【解决方案1】:

首先,警告不会阻止程序编译。 第二:你确定编译你正在编辑的文件吗? 我在大学里举办了一些教程,大多数初学者都犯了这个错误。 如果你可以肯定地说你正在编译你正在编辑的文件,那么它可能是由不同的换行设置引起的,但我认为这极不可能。

您使用哪个编辑器/IDE?

【讨论】:

    【解决方案2】:

    您所要做的就是等待新的 C++0x 标准。源文件末尾不再需要换行符。 (这花了 40 年?)

    【讨论】:

    • 在处理头文件的时候其实是个大问题。但是现在大多数编译器已经能够在没有额外空行的情况下正常工作十年或更长时间了。
    【解决方案3】:

    大多数基于 Unix 的文本编辑器会自动添加尾随换行符,但显然 Notepad++(我从未使用过)没有。

    文件不需要以空行结尾(可以表示为两个换行符 连续的字符),只是一个正确终止的字符。

    看看 Notepad++ 是否有一个配置选项告诉它自动追加一个换行符 保存文件时,或者至少询问您是否要添加文件。

    很好的解释 - 我遇到了同样的问题,只是使用写字板而不是记事本解决了它:)

    【讨论】:

      【解决方案4】:

      问题与您的 C++ 代码无关;我几乎可以向您保证,您的程序中未初始化的布尔值不会导致问题。这是源文件本身的问题。 “Hello, world”程序会产生同样的警告。

      文本文件(包括 C++ 源文件)由多行字符组成,其中每一行都以行尾标记终止。在 Unix 中,因此在 Cygwin 中(使用默认设置),行尾标记是单个 '\n'(换行符,换行符)字符。 (Windows 使用 CR-LF 对 ("\r\n")。

      文本文件的最后一行可能以换行符结尾,但 g++ 更喜欢正确终止它。

      大多数基于 Unix 的文本编辑器会自动添加尾随换行符,但显然 Notepad++(我从未使用过)不会。

      文件不需要以 blank 行结尾(将表示为一行中的两个换行符),只需一个正确终止的行即可。

      看看 Notepad++ 是否有一个配置选项,告诉它在保存文件时自动追加一个换行符,或者至少询问您是否要添加一个。

      (文件末尾缺少的换行符可能是导致您在发布问题时粘贴代码出现问题的原因。)

      【讨论】:

        【解决方案5】:

        也许是某些隐形字符有问题?我复制粘贴您的代码并在 Cygwin 下使用以下 g++ 编译,没有任何警告/错误:

        $ g++ --version
        g++ (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
        

        【讨论】:

        • 问题是,在网上传输源代码时,这种问题很容易消失……不管他的源代码是否有尾随换行,你可以很容易地复制这里的副本包含或排除换行符...
        【解决方案6】:

        最终没有将布尔变量初始化为 false 是问题所在。但是,我不确定是否实际上是初始化问题,或者只是文本编辑器实际上可能不会保存文件,如果您只是将空格附加到文件的末尾。对于那些想知道的人,这是在 Notepad++ 中发生在我身上的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-09
          • 1970-01-01
          • 2011-03-16
          • 2017-12-01
          • 2012-10-24
          • 1970-01-01
          • 1970-01-01
          • 2020-03-06
          相关资源
          最近更新 更多