从文件中读取而不跳过空格

Posted

技术标签:

【中文标题】从文件中读取而不跳过空格【英文标题】:Reading from a file without skipping whitespaces 【发布时间】:2016-11-22 23:21:04 【问题描述】:

我正在尝试编写一个代码,该代码将更改文件中的一个给定单词,并将其更改为另一个单词。该程序以一种逐字复制的方式工作,如果它是普通单词,它只是将其写入输出文件,如果它是我需要更改的那个,它会写入我需要更改的那个。但是,我遇到了一个问题。程序没有将空格放在输入文件中的位置。我不知道这个问题的解决方案,我不知道我是否可以使用noskipws,因为我不知道文件在哪里结束。

请记住,我是一个完全的新手,我不知道事情是如何运作的。不知道标签够不够显眼,再提一下我用的是C++

【问题讨论】:

查看输入修饰符noskipws 显然,您确实知道何时到达文件末尾:尝试读取另一个字符或单词失败。 当我使用“noskipws”时,“eof()”不起作用。但我想我不应该用它来检查文件是否已经结束 eof() 无论如何都不是确定文件结尾的方法:您检查流状态,即您尝试读取然后检查流的状态,例如,通过转换它为布尔值,例如,while (stream >> value) ... 。当然,std::ios_base::noskipws 设置时,你需要读取单词之间的空格字符。 【参考方案1】:

由于单词的每次阅读都以空格或文件结尾结束,您可以简单地检查停止阅读的内容是文件结尾还是空格:

if ( reached the end of file ) 
  // What I have encountered is end of file 
  // My job is done
 else 
  // What I have encountered is a whitespace
  // I need to output a whitespace and back to work

这里的问题是如何检查 eof(文件结尾)。 由于您使用的是 ifstream,因此事情将非常简单。 当 ifstream 到达文件末尾(已读取所有有意义的数据)时, ifstream::eof() 函数将返回 true。 假设您拥有的 ifstream 实例称为输入。

if ( input.eof() == true ) 
  // What I have encountered is end of file
  // My job is done
 else 
  // What I have encountered is a whitespace
  // I need to output a whitespace and back to work

PS : ifstream::good() 到达 eof 或发生错误时将返回 false。检查 input.good() == false 是否是一个更好的选择。

【讨论】:

建议针对if (!input) 而不是if ( input.eof() == true ) 进行测试,因为流中可能出现的错误不仅仅是文件结尾。仅仅测试 EOF 就可以让代码进入错误读取的无限循环。 我怎么知道是空格还是换行符? 检查输入比eof()好,和good()一样。虽然使用 ifstream 作为条件可能会让初学者感到困惑。 我的建议是:每次读一行,然后使用 istringstream 将行分解为单词。顺便说一句,格式化格式错误的文章可能非常困难。【参考方案2】:

首先,我建议您不要在同一个文件中读写(至少不要在读取期间),因为这会使您的程序更难写/读。

其次,如果您想读取所有空格,最简单的方法是使用 getline() 读取整行。

可用于将单词从一个文件修改到另一个文件的程序可能如下所示:

void read_file()

    ifstream file_read;
    ofstream file_write;
    // File from which you read some text.
    file_read.open ("read.txt");
    // File in which you will save modified text.
    file_write.open ("write.txt");

    string line;
    // Word that you look for to modify.       
    string word_to_modify = "something";
    string word_new = "something_new";

    // You need to look in every line from input file. 
    // getLine() goes from beginning of the file to the end.
    while ( getline (file_read,line) ) 
        unsigned index = line.find(word_to_modify);
        // If there are one or more occurrence of target word.
        while (index < line.length()) 
            line.replace(index, word_to_modify.length(), word_new);
            index = line.find(word_to_modify, index + word_new.length());
        

        cout << line << '\n';
        file_write << line + '\n';
    


    file_read.close();
    file_write.close();

【讨论】:

以上是关于从文件中读取而不跳过空格的主要内容,如果未能解决你的问题,请参考以下文章

替换字符串中的单词而不跳过空格

Xcopy共享违规,如何仍然复制而不跳过

Python:如何在迭代列表时从列表中删除元素而不跳过未来的迭代

如何在不跳过值的情况下读取 PHPExcel 中的空单元格?

从文件中读取时一次跳过空格

使用 SQL Server Rank 函数对行进行排名而不跳过排名号