在 C++ 中按字符读取输入文件时的换行符

Posted

技术标签:

【中文标题】在 C++ 中按字符读取输入文件时的换行符【英文标题】:Line Breaks when reading an input file by character in C++ 【发布时间】:2013-03-13 02:20:06 【问题描述】:

好的,先说明一下,这是家庭作业,但还要一周才能完成,而且我不完全确定作业的最终细节。长话短说,不知道他会在课堂上介绍什么概念,我决定试一试作业,但我遇到了一个问题。我需要做的部分作业是从输入文件中读取单个字符,然后,给定字符在其包含的单词中的位置,在屏幕上重复该字符。我遇到的问题是,文本文件中的单词是单个单词,每个单词都位于文件的不同行。由于我不确定我们是否会使用<string> 来完成这项作业,所以我想知道是否有任何方法可以在不使用<string> 的情况下识别行尾。

现在,我正在使用简单的ifstream fin; 来提取字符。我只是不知道如何让它识别一个单词的结尾和另一个单词的开头。为了包含代码,以下是我到目前为止所获得的全部内容。我希望它会显示某种endl 字符,但它只是将所有单词一起打印出来。

ifstream fin;
char charIn;

fin.open("Animals.dat");
fin >> charIn;
while(!fin.eof())
    cout << charIn;
    fin >> charIn;

我最初忘记包含的一些内容:

我必须在输入每个字符时对其进行处理(在读取下一个字符并增加计数器之前,我的打印循环需要运行)。此外,“Animals.dat”中单词的长度各不相同,这使我无法设置多个迭代。我们还没有介绍 fin.get() 或 .getline(),所以这些也是禁区。

老实说,我无法想象这是不可能的,但考虑到这些限制,如果是这样,我并不会太沮丧。我主要认为坐一会儿是一个有趣的问题。

【问题讨论】:

好吧,如果你把while (!fin.eof())换成while (/*read something*/),希望你的老师会更高兴。 如果文件是作为文本文件打开的,而不是二进制文件,那么在 Unix 和 Windows 上,行尾将显示为换行符,'\n' 能否详细说明位置重复描述?你的意思是“猫”这个词会变成“caattt”吗? 我想指出,这是一个家庭作业问题的示例,与大多数问题相比,它的提出非常好。这不是“给我 teh codez”,不是逐字逐句发布的作业,也不是对没人会理解的作业的模糊描述。它有一个描述性的标题、一个具体的问题和一个明确的解决方案。它还包括对问题的尝试。这表明,只要发布得当,家庭作业问题与其他任何问题一样合理。 我只想感谢所有回答和贡献的人。我问的主要原因是看看我们在课堂上已经讲过的内容是否有解决方案。今天,他介绍了 .get,所以,对于那些足够关心想知道的人来说,这就是他希望我们走的路。再次感谢。 【参考方案1】:

为什么不使用字符数组?你可以尝试如下:

    #define MAX_WORD_NUM 20
    #define MAX_STR_LEN 40 //I think 40 is big enough to hold one word.
    char words[MAX_WROD_NUM][MAX_STR_LEN];

然后就可以给单词输入一个单词了。

    cin >> words[i];

【讨论】:

感谢您的回复。这个解决方案没有解决我最初的问题,在阅读单个字符时,我无法弄清楚如何区分一个单词的结尾。它们的长度各不相同,所以没有办法说读了这么多然后移到下一个单词。此外,这让我想起了我需要在我的问题中澄清的一些事情。 @jvance:一旦将单词存储在数组中,访问单个字符就很容易了。 是的,那么他可以轻松地为所欲为。 再次阅读您的回复后(并根据其他一些回复),我明白了我第一次看错的地方。不过,再次感谢您的回答。【参考方案2】:

&gt;&gt; 运算符会忽略空格,因此您永远不会得到换行符。即使不允许使用 &lt;string&gt; 类,您也可以使用 c 字符串(字符数组):

ifstream fin;
char animal[64];

fin.open("Animals.dat");

while(fin >> animal) 
  cout << animal << endl;

当从 c-string 读取字符时(上面是 animal),最后一个字符总是 0,有时表示为 '\0' 或 NULL。这是您在遍历单词中的字符时检查的内容。例如:

c = animal[0];
for(int i = 1; c != 0 && i < 64; i++)

    // do something with c
    c = animal[i];

【讨论】:

注意:您可以使用单个粘性操纵器 noskipws 关闭空格跳过,从而使读取任何临时缓冲区的需要变得毫无意义。 直接读取字符的方式是使用readget函数,而不是&gt;&gt;用于formatted I/O。 等等,-1。 operator &gt;&gt; 不知道这里的数组大小,它将其视为char * 并使用与std::string 相同的字符串语义......但没有内存安全。看不出这是如何回答问题的。

以上是关于在 C++ 中按字符读取输入文件时的换行符的主要内容,如果未能解决你的问题,请参考以下文章

从文件逐字读取并确定换行 C++

如何在 C++ 中使用 cin 将所有空格读入字符串?

C++面向行输入:get()与getline()

C++学习之旅getgetline的用法

使用 C++ 在运行时使用转义序列

怎么用c++读取文本文件中的换行符和空格?