如何只读取一个int并忽略C ++中的其余部分

时间:2013-10-16 20:44:39

标签: c++

例如,假设我有一个.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 个答案:

答案 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)

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

答案 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;
        }
    }
}