C ++为什么我的换行符被误解?

时间:2014-12-03 21:04:35

标签: string file newline

我正在用c ++编写一个驱动程序,最终需要将两个字符串传递给我在一个单独文件中编写的函数。我正在读取格式如下的文件中的数据:

ac: and
amo: love
amor: love
animal: animal
annus: year
ante: before, in front of, previously
antiquus: ancient
ardeo: burn, be on fire, desire
arma: arms, weapons
atque: and
aurum: gold
aureus: golden, of gold
aurora: dawn

我试图将拉丁词改为一个字符串,将英语等同于另一个字符串。此外,每次我得到一个英语等价物,我希望能够将两个字符串发送到我的函数。我的代码目前看起来像这样:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

//#include "tree.h"

int main(int argc, char* argv[])
{
    string latinWord   = "",
           englishWord = "";

    char   buffer;

    bool   isLatinWord = true;

    ifstream vocabFile;
    vocabFile.open(argv[1]);

    if (!vocabFile)
       cout << "File open failed." << endl;

    while(vocabFile.get(buffer))
    {

        if (isLatinWord)
        {
            if (buffer == ':')
                isLatinWord = false;

            else
                latinWord+= buffer;
        }

        else
        {
            if (buffer == ',') // indicates 1 of multiple equivs processed
            {
                cout << englishWord << " = " << latinWord << endl;
                englishWord = "";
            }

            else if (buffer == '\n') // indicates all english equivs processed
            {
                cout << englishWord << " = " << latinWord << endl;
                isLatinWord = true;
                englishWord = latinWord = ""; // reset both strings
            }

            else
                englishWord+= buffer;
        }
    }
}

这应该的方式是,如果有一个冒号,表示拉丁语单词字符串已完成填充(标志设置为false),然后英语单词字符串应该开始填充。应该填充英语单词字符串,直到命中逗号(此时将单词发送到函数),或者命中换行符(重置标志,因为此时已经检查了所有英语等值)。

然而,当我尝试输出我发送给我的函数的字符串时,它们完全搞砸了。

这是我的输出:

$ ./prog5 latin.txt
 = ac
 = amo
 = amor
 = animal
 = annus
 before = ante
 in front of = ante
 = anteusly
 = antiquus
 burn = ardeo
 be on fire = ardeo
 = ardeo
 arms = arma
 = armas
 = atque
 = aurum
 golden = aureus
 = aureus
 = aurora

[编辑]这是我修改了isLatinWord标志后的输出。 我认为我的代码以错误的方式识别换行符,我想知道是否有人发现任何错误或有任何建议?

谢谢, 本

3 个答案:

答案 0 :(得分:1)

新行也可以表示为\ r \ n字符,我也会检查它。

答案 1 :(得分:0)

使用getline读取(部分)行到所需的分隔符:

#include<iostream>
#include<fstream>
#include<sstream>
using namespace std;

int main() {
    string word;
    ifstream data("data.txt");

    string latin_word;
    while(getline(data,latin_word,':')) { // Read up to, but not including, the colon. But it does *discard* the colon
        cout << "Read latin word: <" << latin_word << '>' << endl;
        // Read the rest of the line
        string rest_of_line;
        getline(data, rest_of_line);
        // Now, we want to split it on commas. Easiest way is to build a stream object wrapped around this string
        istringstream rest_of_line_stream(rest_of_line);
        string english_phrase;
        while(
                  rest_of_line_stream >> std:: ws, 
                  getline(rest_of_line_stream, english_phrase,',')
             ) {
            cout << '@' << latin_word << "@\t@" << english_phrase << '@' << endl;
        }
    }
}

更新:我忘了丢弃足够的空白。 getline默认保留任何前导空格。在此数据中:,之后,这可能会出现问题。因此,在尝试阅读英语短语之前,我使用rest_of_line_stream >> std:: ws来阅读和丢弃任何空格。

内部while循环可能看起来有点奇怪。我在while括号内有两件事:rest_of_line_stream >> std:: ws然后是getline(rest_of_line_stream, english_phrase,',')。它们用逗号分隔,这是C和C ++中的逗号运算符。基本上,它只是意味着第一件事被评估,但其结果被忽略。用于while循环的布尔值只是getline(rest_of_line_stream, english_phrase,',')

的结果

答案 2 :(得分:0)

这一行

latinWord = true;

应该是

isLatinWord = true;