为什么c++;在python不可用时排除\n 编写了一个小写代码,输出了C++和Python中ASCII值的总和,给出了一个输入文件。 C++块似乎排除了\n,而Python块确实包含了“\n”作为其计算的一部分,对于相同的输入文本文件。
我想知道我的代码中是否有我忽略的步骤 代码块:为什么c++;在python不可用时排除\n 编写了一个小写代码,输出了C++和Python中ASCII值的总和,给出了一个输入文件。 C++块似乎排除了\n,而Python块确实包含了“\n”作为其计算的一部分,对于相同的输入文本文件。,c++,python,C++,Python,我想知道我的代码中是否有我忽略的步骤 代码块: 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=='
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;
}
#包括“iostream”
#包括“fstream”
#包括“字符串”
int k;
int main(int argc,char*argv[])
{
整数和=0;
std::字符串行;
std::ifstream myfile(argv[1]);
如果(myfile.is_open())
{while(myfile.good())
{
getline(myfile,line);
对于(k=0;k,默认情况下,ifstream::getline
使用'\n'
作为行尾的分隔符。它丢弃了分隔符,因此您看到的是您所期望的。根据std::getline()
[string.io]§7的规范:
从is中提取字符并将其附加到str…直到
发生以下情况:
- traits::下一个可用输入字符c的eq(c,delim)(在这种情况下,c是提取的,但不是附加的)
(我的重点)
这意味着当getline
遇到分隔符时(\n
默认情况下),它会将其从流中删除,但不会将其存储在字符串中
至于直接回答你的“为什么”问题:因为它就是这样设计的。你的Python代码没有做你认为它正在做的事情。你正在将整个文件读入字符串f
,然后对它进行迭代,生成单字符字符串而不是行
但是,即使您使用了正确的方法并使用了readlines
或直接迭代了file对象,您仍然会遇到保留尾随换行符的问题。原因是:
f.readline()
从文件中读取一行;换行符(\n)保留在字符串的末尾,只有当文件没有换行符结尾时,才会在文件的最后一行忽略。这使得返回值明确无误;iff.readline()
返回一个空字符串,即已到达文件末尾,而空行由“\n”表示,该字符串仅包含一个换行符
C++使用了不同的信令结尾的方法,所以不需要保留这个区别,并且可以自由地丢失尾行。这通常比较方便。
它们是不同的语言,它们具有不同的规范和不同的库,为什么你会期望它们工作相同?你的C++代码会计算最后一个LIN。两次删除文本文件。旁白:永远不要使用.eof()
或.good()
作为循环构造。它几乎总是产生错误代码,就像在您的示例中一样。@segfolt原因是我的评论。good
不能很好地指示下一次提取是否成功。事实上,在这种情况下,将读取最后一行并提取最终的\n
但不会设置错误位。下一次迭代将尝试提取另一行,但没有。@segfolt惯用的方法是while(std::getline(myfile,line))…