C++,通过 fstream 库检查两个 txt 文件以连接具有相同 ID 的行
C++, checking two txt files via fstream library to concatenate lines with the same ID
我必须编写一个程序来检查两个 txt 文件并连接以相同 ID 开头的行。结果必须在一个新文件中文件格式如下:
ID STRING_UP_TO_30_CHARS
不需要错误检查,但我已经为此强调了很长一段时间。由于我是大学新生,所以我对一般的编程还很陌生。
我现在拥有的代码:
int main()
{
temp();
fstream file1;
fstream file2;
ofstream result;
string line1, line2;
int pos1, pos2;
string id1, id2;
file1.open("first.txt");
file2.open("second.txt");
result.open("resultat.txt");
while(getline(file1, line1))
{
pos1 = line1.find(" "); //id and word are seperated by a space character, so I find the position of this space character
id1 = line1;
id1.erase(id1.begin()+pos1, id1.end()); //id is now a digit but string,
while(getline(file2,line2))
{
pos2 = line2.find(" ");
id2 = line2;
id2.erase(id2.begin()+pos2, id2.end()); //id is digit now
if(id2 == id1)
{
result<<line1<<" "<<line2<<endl;
// line2.erase(line2.begin(), line2.end());
break;
}
}
}
}
我创建了一个函数来创建第二个文件的临时文件,因为我尝试从第二个文档中删除行以使代码工作。暂时忽略 temp()。
问题是它只在我的 result.txt 文件中创建了 2 行。我还必须将所有未与其他 txt 文件中的任何行配对的行添加为最终文件中的单独行,但这目前对我来说不是问题。
我正在测试的 Txt 文件可能很重要:
21 para
23 dyta
27 treta
11 katert
12 pest
13 fundit
14 jojo
41 vecant
46 vecanti
12 fifth
21 first
23 second
29 third
11 fourth
13 last
14 nono
91 special
104 specialty
我得到的结果是:
21 para 21 first
23 dyta 23 second
我看到有人建议使用向量,但我在学校没有学过,而且我也不允许在我的应用程序中使用任何其他库。
while(getline(file2,line2))
在此内部循环从第二个文件中找到与第一个文件中的第一行匹配的行后,外部循环再次运行以从第一个文件中读取第二行。
然而,之后,这个内部循环只是从点[=31]继续读取第二个文件 =]在外循环的前一次迭代中停止读取的地方。它找到了第一行,while
循环终止。现在,它再次从 file2
继续到 getline
,因此它只是继续阅读其余部分。
计算机编程的黄金法则指出:“计算机总是完全按照您的指示去做,而不是按照您的意愿去做”。它的推论是:“计算机永远不会做你从未告诉它做的事”。
在这种情况下,您没有告诉您的计算机从第二个文件的开头开始,再次开始搜索与第一个文件中的第二行匹配的行。所以,你的电脑从来没有这样做过。
你的 C++ 教科书应该解释如何使用 seekg
来寻找你的 fstream
从中读取文件内容的位置。您只需要在内部 while
循环之前显式 seekg
回到 file2
的开头,这样它总是从第二个文件的开头开始读取。
我必须编写一个程序来检查两个 txt 文件并连接以相同 ID 开头的行。结果必须在一个新文件中文件格式如下:
ID STRING_UP_TO_30_CHARS
不需要错误检查,但我已经为此强调了很长一段时间。由于我是大学新生,所以我对一般的编程还很陌生。
我现在拥有的代码:
int main()
{
temp();
fstream file1;
fstream file2;
ofstream result;
string line1, line2;
int pos1, pos2;
string id1, id2;
file1.open("first.txt");
file2.open("second.txt");
result.open("resultat.txt");
while(getline(file1, line1))
{
pos1 = line1.find(" "); //id and word are seperated by a space character, so I find the position of this space character
id1 = line1;
id1.erase(id1.begin()+pos1, id1.end()); //id is now a digit but string,
while(getline(file2,line2))
{
pos2 = line2.find(" ");
id2 = line2;
id2.erase(id2.begin()+pos2, id2.end()); //id is digit now
if(id2 == id1)
{
result<<line1<<" "<<line2<<endl;
// line2.erase(line2.begin(), line2.end());
break;
}
}
}
}
我创建了一个函数来创建第二个文件的临时文件,因为我尝试从第二个文档中删除行以使代码工作。暂时忽略 temp()。
问题是它只在我的 result.txt 文件中创建了 2 行。我还必须将所有未与其他 txt 文件中的任何行配对的行添加为最终文件中的单独行,但这目前对我来说不是问题。
我正在测试的 Txt 文件可能很重要:
21 para
23 dyta
27 treta
11 katert
12 pest
13 fundit
14 jojo
41 vecant
46 vecanti
12 fifth
21 first
23 second
29 third
11 fourth
13 last
14 nono
91 special
104 specialty
我得到的结果是:
21 para 21 first
23 dyta 23 second
我看到有人建议使用向量,但我在学校没有学过,而且我也不允许在我的应用程序中使用任何其他库。
while(getline(file2,line2))
在此内部循环从第二个文件中找到与第一个文件中的第一行匹配的行后,外部循环再次运行以从第一个文件中读取第二行。
然而,之后,这个内部循环只是从点[=31]继续读取第二个文件 =]在外循环的前一次迭代中停止读取的地方。它找到了第一行,while
循环终止。现在,它再次从 file2
继续到 getline
,因此它只是继续阅读其余部分。
计算机编程的黄金法则指出:“计算机总是完全按照您的指示去做,而不是按照您的意愿去做”。它的推论是:“计算机永远不会做你从未告诉它做的事”。
在这种情况下,您没有告诉您的计算机从第二个文件的开头开始,再次开始搜索与第一个文件中的第二行匹配的行。所以,你的电脑从来没有这样做过。
你的 C++ 教科书应该解释如何使用 seekg
来寻找你的 fstream
从中读取文件内容的位置。您只需要在内部 while
循环之前显式 seekg
回到 file2
的开头,这样它总是从第二个文件的开头开始读取。