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

根据std::getline()[string.io]§7 的规范:

从 is 中提取字符并将它们附加到 str ... 直到发生以下任何情况:

  • ...
  • traits::eq(c, delim) 用于下一个可用输入字符 c (在这种情况下, c 被提取但不附加

(强调我的)。

这意味着当getline遇到分隔符(\n默认情况下)时,它会将其从流中删除,但不会将其存储在字符串中。

至于直接回答你的“为什么”问题:因为它是这样设计的。

于 2013-04-17T18:18:54.963 回答
4

默认情况下,ifstream::getline用作'\n'行尾的分隔符。它会丢弃分隔符,因此您所看到的就是您所期望的。

于 2013-04-17T18:15:46.863 回答
1

你的 Python 代码并没有按照你的想法去做。您正在将整个文件读入 string f,然后遍历它,生成单个字符串而不是行。

但是,即使您以正确的方式进行操作并readlines直接使用或迭代文件对象,您仍然会遇到与保留尾随换行符相同的问题。原因来自输入输出教程中的这句话:

f.readline()从文件中读取一行;换行符 (\n) 留在字符串的末尾,如果文件不以换行符结尾,则仅在文件的最后一行省略换行符。这使得返回值明确;如果f.readline()返回一个空字符串,则表示已到达文件末尾,而空行由 '\n' 表示,该字符串仅包含一个换行符。

C++ 使用不同的方法来表示文件结束,因此它不需要保留这种区别并且可以随意丢失尾随的换行符。这通常更方便。

于 2013-04-17T18:38:49.833 回答