这是我从命令行获取文件名并打开文件并将文件内容逐行保存到字符串的方法。除了文件开头的三个空格外,所有程序都能正常工作。有人能说出为什么会出现这些空白区域,我怎么能忽略它们呢?
string filename = "input.txt";
char *a=new char[filename.size()+1];
a[filename.size()]=0;
memcpy(a,filename.c_str(),filename.size());
ifstream fin(a);
if(!fin.good()){
cout<<" = File does not exist ->> No File for reading\n";
exit(1);
}
string s;
while(!fin.eof()){
string tmp;
getline(fin,tmp);
s.append(tmp);
if(s[s.size()-1] == '.')
{
//Do nothing
}
else
{
s.append(" ");
}
cout<<s<<endl;
答案 0 :(得分:1)
最可能的原因是您的文件是以ASCII以外的其他方式编码的。它包含一堆不可打印的字节,屏幕上的字符串是终端解释这些字节的结果。要确认这一点,请在完成阅读后打印s
的大小。它应该大于您在屏幕上看到的字符数。
其他问题:
string filename = "input.txt";
char *a=new char[filename.size()+1];
a[filename.size()]=0;
memcpy(a,filename.c_str(),filename.size());
ifstream fin(a);
是一种过于热心的方式。只需在C ++ 11中编写ifstream fin(a.c_str());
或简称ifstream fin(a);
。
接下来,
while(!fin.eof()){
几乎肯定是一个错误。 eof()
不会告诉您下一次阅读是否会成功,只会说明最后一次阅读是否达到eof
。以这种方式使用它会导致最后一行似乎是read twice。
在使用结果之前,始终始终检查读取操作是否成功。这是通过将getline
置于循环条件中来实现的:while (getline(fin, tmp))