如何比较文件中包含的下一个字符

How can I compare the next character which the file contains?

本文关键字:包含 下一个 字符 文件 何比较 比较      更新时间:2023-10-16

我在阅读代码时遇到了一些问题。这是文本文件。

2X^6+3X^3+4X^0=0
5X^6+X^2+X^1-4X^0=0

我在第一行得到了正确的输入,但在第二行,我需要忽略第一行。我在这里搜索了一下,找到了如何使用它,忽略第一行剩下的所有字符就可以到达下一行。

您可以在X的第二行中看到,没有整数,现在问题是循环连续运行时的第二个问题。若我在带有X的文本文件中添加1,该文件将完全读取。此外,我如何设置一个条件来满足这一点,即当直接存在X-X时,它应该存储1或者-1并转到下一个字符?您还可以看到^我必须将其存储在一个变量中,而我应该忽略它,但不知道如何忽略它?

提前感谢

int main()
{
int in;
int power;
char x;
char f;
fstream fin;
fin.open("input1.txt");
list l1,l2;
while(fin.peek() != 61)
{
fin>>in;
fin>>x;
fin>>f;
fin>>power;
cout<<in<<endl<<x<<endl<<f<<endl<<power<<endl;
l1.addtoend(in,power,x);
cout<<endl;
}
fin.ignore(2,'n');
while(fin.peek() != 61)
{
fin>>in;
fin>>x;
fin>>f;
fin>>power;
cout<<in<<endl<<x<<endl<<f<<endl<<power<<endl;
l2.addtoend(in,power,x);
cout<<endl;
}
l1.display();
l2.display();
}

不幸的是,这并不像预期的那么简单。

我们需要把任务分成更小的部分。

你想做的是,将方程分解为项,并从中提取系数和指数。

把一些东西分成相似的部分也被称为标记化。

所以,你的方程由项组成,它们都遵循相同的模式。首先是一个可选的符号,后面是系数,然后是"X^",最后是指数(可能有符号,也可能没有符号(。

由于所有术语都有相同的模式,我们可以使用所谓的regex来找到它们。C++支持此功能。此外,为了将文本拆分为更小的标记/术语/模式匹配,我们有一个特殊的迭代器std::sregex_token_iterator。与C++中的任何其他迭代器一样,它对源字符串进行迭代,并提取(和复制(所有匹配的模式。

好的,那么我们已经为第一个子任务找到了解决方案。提取所有术语并将它们放入std::vector中。在定义变量时,我们将使用std::vector的范围构造函数来实现这一点。

下一步是得到系数。这里我们需要一些特殊的处理,因为系数可以用假定的1省略。使用这个假设,我们将读取该项并将系数转换为整数。因为我们想在一句话中做到这一点,所以我们使用STL算法库中的std::transform

获取指数更容易。我们只需将"^"符号后面的项中的任何内容转换为整数。我们再次使用std::transform在一个语句中处理所有术语。

最后但同样重要的是,我们将得到方程的右手边,并将其转换为整数。

请注意:

所有这些也可以通过浮点类型的值来完成我们也可以在方程中允许空间

为此,我们将简单地修改std::regex-字符串。

请参阅下面的完整示例:

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <regex>
#include <algorithm>
#include <iomanip>
int main() {
std::string equation{ "5X^6+X^2+X^1-4X^0=0" };
const std::regex re(R"(([+-]?d?X^[+-]?d+))");
std::vector<std::string> terms{ std::sregex_token_iterator(equation.begin(), equation.end(), re,1),std::sregex_token_iterator() };

std::vector<int> coefficients(terms.size());
std::vector<int> exponents(terms.size());
int rightHandSite{ 0 };
// Everything in front of X is the coefficient. Handle special case, when no digit is given
std::transform(terms.begin(), terms.end(), coefficients.begin(), [](const std::string& s) {
std::string temp = s.substr(0U, s.find('X'));
if (1 == temp.size() && !std::isdigit(temp[0])) temp += '1';
return std::stoi(temp); });
// Get all exponents
std::transform(terms.begin(), terms.end(), exponents.begin(), [](const std::string & s) {
return std::stoi(s.substr(s.find('^') + 1)); });
// Get right Hand site of equation
rightHandSite = std::stoi(equation.substr(equation.find('=') + 1));
// Show result
std::cout << "nEquation: " << equation << "nnFound '" << terms.size() << "' terms.nnCoeffient  Exponentn";
for (size_t i = 0U; i < terms.size(); ++i)
std::cout << std::right << std::setw(9) << coefficients[i] << std::setw(10) << exponents[i] << "n";
std::cout << "n                  --> " << rightHandSite << "n";
return 0;
}

还有许多其他可能的解决方案。但也许它会给你一些关于你能做什么的想法