如何比较文件中包含的下一个字符
How can I compare the next character which the file contains?
我在阅读代码时遇到了一些问题。这是文本文件。
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;
}
还有许多其他可能的解决方案。但也许它会给你一些关于你能做什么的想法
- 重新定位图像时如何前进到下一个内存块
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 用于在 C++ 中使用 while 循环查找下一个素数的简单函数
- CIN 仅在输入非数字值时跳过下一个 CIN
- C++ .h 包含从一个类传递到另一个类的类和.cpp
- 查找最小的下一个更大的元素
- 转到基于范围的 for 循环中的下一个迭代器
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 如何检查流中文件的下一个单词是否为 alpha?
- 如何打印下一个字母直到 Z 并继续到 A?
- 在使用堆栈为下一个最大数字编写代码时面临 SIGSEGV(分段错误)
- 使用一个内存集数组和单个堆栈在 O(n) 中查找数组的下一个更大元素
- 有没有一种标准方法可以在C++中获取第 n 个"下一个"浮点值
- 下一个云桌面客户端构建过程
- 创建一个 const std::vector ,其中包含另一个 const std::vector 和其他值
- 如何比较文件中包含的下一个字符
- 按字典顺序从范围中获取下一个数字(不包含所有字符串的容器)
- 包含指向下一个的指针的排序结构
- 两个类相互包含,下一个代码有什么问题?