我正在用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标志后的输出。 我认为我的代码以错误的方式识别换行符,我想知道是否有人发现任何错误或有任何建议?
谢谢, 本
答案 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;