2

入力ファイルを指定して、C ++とPythonの両方でASCII値の合計を出力する簡単なコードを作成しました。

同じ入力テキスト ファイルに対して、C++ の部分では '\n' が除外されているようですが、Python の部分では計算の一部として '\n' が含まれていました。

コードに見落としているステップがあるかどうか疑問に思っていました。

コード片:

    import sys

    try:
         f=open(sys.argv[1]).read()
    except:
        print " file not found \n"  
        sys.exit()
    sum=0
    for line in f:
       for character in line:
          try:
        if character=='\n':
            pass
        else:
            print character
            sum+=ord(character)

    except:
        print "failed \n"
        pass


     print "The sum is %d \n" %sum

そして、C++ の部分は次のとおりです。

    #include "iostream"
    #include "fstream"
    #include "string"
    int k;
    int main(int argc, char *argv[])
    {
    int sum=0;
    std::string line;
    std::ifstream myfile (argv[1]);
    if (myfile.is_open())
      {while (myfile.good())
        {
        getline (myfile,line);
        for (k=0;k<(line.length());k++)
            {
                sum=sum+int(line[k]);
            }
    }
std::cout<<" The total sum is : " <<sum<<std::endl;
}
  else std::cout<< "Unable to open file ";
  return 0;
  }
4

3 に答える 3

4

デフォルトでは、行末の区切り文字としてifstream::getline使用されます。'\n'区切り文字を破棄するため、表示されているものは期待どおりです。

于 2013-04-17T18:15:46.863 に答える
4

std::getline()[string.io]§7の仕様によると:

次のいずれかが発生するまで、 is から文字を抽出し、それらを str ... に追加します。

  • ...
  • 次に使用可能な入力文字 c の traits::eq(c, delim) (この場合、 c は抽出されますが、追加されません)

(強調鉱山)。

これはgetline、 が区切り文字 (\nデフォルト) に遭遇すると、それをストリームから削除しますが、文字列には格納しないことを意味します。

そして、あなたの「なぜ」という質問に直接答えるとしたら、そのように設計されているからです。

于 2013-04-17T18:18:54.963 に答える
1

あなたの Python コードは、あなたが思っていることをしていません。ファイル全体を string に読み込みf、それを繰り返し処理して、行ではなく単一の文字列を生成します。

ただし、適切な方法でreadlinesファイルオブジェクトを直接使用または反復した場合でも、末尾の改行が保持されるという同じ問題が発生します。その理由は、Input and Output Tutorialの次のステートメントから来ています。

f.readline()ファイルから 1 行を読み取ります。改行文字 (\n) は文字列の最後に残され、ファイルが改行で終わらない場合、ファイルの最後の行でのみ省略されます。これにより、戻り値が明確になります。が空の文字列を返す場合f.readline()、ファイルの最後に達していますが、空白行は改行を 1 つだけ含む文字列 '\n' で表されます。

C++ は、ファイルの終わりを通知する別の方法を使用するため、この区別を保持する必要はなく、末尾の改行を自由に失うことができます。これは通常、より便利です。

于 2013-04-17T18:38:49.833 に答える