例如,假设我有一个.txt文件中的这些数据行,如下所示:
43-.u87t 24days r random sentence
54pj6fcb5 22things L random sentence
我需要让43忽略其余部分,然后获得24个忽略天数,然后获取r然后获取字符串,然后使用下一行再次执行。
我最终将此信息输入到输出文件中,其中43将是用作填充字符的ascII字符,24将是输出字符串的宽度,r将等于右对齐并且字符串刚刚被放入。所以第1行的输出为:
+++++++++random sentence
第2行将是:
random sentence6666666
这不是我的确切任务,但非常相似。现在我有这个:
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
using namespace std;
int main()
{
string filename;
int a, b, c; // ASCII values for fill character
int aw, bw, cw; // width values for setwidth
char x, y, z; // character for right or left justification
string s1, s2, s3; // strings
ifstream inData;
cout << "please enter the location of the file you wish to input: " << endl;
getline(cin, filename);
inData.open(filename.c_str());
inData >>
非常感谢任何帮助。
答案 0 :(得分:0)
(\d*).*? (\d*).*? (\w) .*
上述正则表达式返回三个匹配的组。 (使用Rad Regex Designer http://www.radsoftware.com.au/regexdesigner/测试)
“43-.u87t 24days r random sentence”给出“43”,“24”和“r”
“54pj6fcb5 22things L random sentence”给出“54”,“22”和“L”
我没有C ++环境,但鉴于上述模式,boost regex可以为您完成工作。
希望它有所帮助。
答案 1 :(得分:0)
尝试读取每个字符,如果是数字,请使用isdigit()进行检查。 如果检测到数字,请将其放在字符串中,直到isdigit()为false。然后将字符串转换为数字。
MFG
答案 2 :(得分:0)
尽管如此,您是否考虑使用正则表达式?
我写了一个快速程序,用一个来解析你的两个例句:
#include <iostream>
#include <string>
#include <regex>
int main ()
{
std::smatch sm;
std::regex r("(\\d*).*? (\\d*).*? (\\w) (.*)");
std::string s[2] = {"43-.u87t 24days r random sentence",
"54pj6fcb5 22things L random sentence"};
for (int i = 0; i < 2; ++i)
{
std::regex_match(s[i], sm, r);
std::cout << "The first number matched is : " << sm[1] << std::endl;
std::cout << "The second number matched is : " << sm[2] << std::endl;
std::cout << "The character matched is : " << sm[3] << std::endl;
std::cout << "The sentence matched is : " << sm[4] << std::endl
<< std::endl;
}
std::cin.get();
return 0;
}
这是输出:
The first number matched is : 43
The second number matched is : 24
The character matched is : r
The sentence matched is : random sentence
The first number matched is : 54
The second number matched is : 22
The character matched is : L
The sentence matched is : random sentence
答案 3 :(得分:0)
您可以使用std::getline()
获取输入的每一行。然后,您可以在该行上使用istringstream
将输入的每个组件解析为文本元素,直到随机句子的第一个字节。获取第一个字节允许istringstream
跳过前导空格直到你的句子。然后,您可以放回该字节,然后将其余输入作为随机句子。
然后可以为您想要的整数值解析前两个字符串(再次使用istringstream
)。
int main () {
std::string line, first, second, sentence;
char just, byte;
int fill, width;
while (std::getline(std::cin, line)) {
std::istringstream iss(line);
if (iss >> first >> second >> just >> byte) {
iss.putback(byte);
std::getline(iss, sentence);
std::istringstream(first) >> fill;
std::istringstream(second) >> width;
//...
} else {
std::cerr << "invalid input: " << line << std::endl;
}
}
}