0

例如,假设我有来自 .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 >> 

任何帮助将不胜感激。

4

4 回答 4

0

尝试读取每个字符并使用 isdigit() 检查它是否是数字。如果您检测到一个数字,请将其放入字符串中,直到 isdigit() 为假。然后将字符串转换为数字。

制造

于 2013-10-16T21:27:49.043 回答
0

menrfa 打败了我。

不过,您是否考虑过使用正则表达式?

我写了一个快速程序,使用一个来解析你的两个例句:

#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
于 2013-10-16T21:29:26.547 回答
0

(\d*).*? (\d*).*? (\w) .*

上面的正则表达式返回三个匹配的组。(使用 Rad Regex Designer http://www.radsoftware.com.au/regexdesigner/进行测试)

“43-.u87t 24days r random sentence”给出“43”、“24”和“r”</p>

“54pj6fcb5 22things L random sentence”给出“54”、“22”和“L”</p>

我没有 C++ 环境,但是根据上述模式,boost regex 可以为您完成这项工作。

希望能帮助到你。

于 2013-10-16T21:09:42.883 回答
0

您可以使用 获取输入的每一行std::getline()。然后,您可以istringstream在该行上使用 a 将输入的每个组件解析为文本元素,直到随机句子的第一个字节。获取第一个字节允许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;
        }
    }
}
于 2013-10-16T21:39:20.570 回答