0

这就是我从命令行获取文件名并打开文件并将文件内容逐行保存到字符串的方式。除了文件开头的三个空格外,所有过程都可以正常工作。有谁可以说为什么会出现这些空白空间,我该如何忽略它们?

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;
4

1 回答 1

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);

是一种非常热心的方法。只需编写ifstream fin(a.c_str());,或简单地ifstream fin(a);在 C++11 中编写。

下一个,

while(!fin.eof()){

几乎可以肯定是一个错误。eof()不会告诉你下一次读取是否会成功,只告诉你最后一次是否到达eof。以这种方式使用它通常会导致最后一行看似被读取两次

始终,始终,在使用结果之前检查读取操作是否成功。这通常是通过放入getline循环条件来完成的:while (getline(fin, tmp))

于 2013-11-04T17:11:35.167 回答