c++ - 如何读取文件内容并将其保存到字符串类型变量中?为什么会有空位?

标签 c++ file

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

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;

最佳答案

最可能的原因是您的文件编码方式不是 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))

关于c++ - 如何读取文件内容并将其保存到字符串类型变量中?为什么会有空位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19772803/

相关文章:

c++ - 无法识别 .h 文件中定义的 typedef 类型

c++ - 我可以延长接受服务器的 TCP 握手持续时间吗?

file - 如何知道 S3 存储桶中存储了多少个对象?

c - fgets 返回段错误 - 读入文件 C

java - 如何打开文件并在 Java 中关闭文件时发出通知?

c++ - 读取位图文件

c++ - 使用 GPU Ocelot 时出现 GCC 链接器错误 (cudaMemGetInfo)

c++ - CMUSphix 不识别

c++ - Windows fnmatch 替代品

javascript - 将 base64 转换为 Javascript 中的文件