C ++检查从文件读取的最后一件事是否是一个数字

时间:2014-03-04 18:34:44

标签: c++

这是一个非常原始的问题,所以我认为解决方案不应该很难,但我没有找到一种方法如何简单地做到这一点,我也没有总结它实际上是在互联网上找到它。所以回答这个问题,我有一个这样的信息文件:

1988 Godfather 3 33 42
1991 Dance with Wolves 3 35 43
1992 Silence of the lambs 3 33 44

我要求将所有信息都放在数据结构中,因此我们可以说它是int yearstring name以及另外三种int类型的数字。但我怎么知道我读的下一件事是不是数字?我永远不知道这个词有多长。
提前感谢那些花时间解决这个原始问题的人。 :)
编辑:不要考虑标题中包含数字的电影。

4 个答案:

答案 0 :(得分:2)

当你去尝试解析其他电影时,你会遇到一些重大问题,例如Free Willy 2。

您可以尝试将其视为std :: stringstream,并依赖最后三个块作为您正在寻找的数据,而不是使用正则表达式进行推广。

答案 1 :(得分:1)

您最好的选择是使用C ++ regex

这样可以让您对要解析的内容进行更精细的控制。 示例:

year -> \d{4}
word -> \w+
number->\d+

答案 2 :(得分:0)

如果您无法控制文件格式,您可能希望沿着这些行执行某些操作(伪进程):

1) read in the line from the file
2) reverse the order of the "words" in the file
3) read in the 3 ints first
4) read in the rest of the stream as a string
4) reverse the "words" in the new string
5) read in the year
6) the remainder will be the movie title

答案 3 :(得分:0)

以字符串形式读取每个字段,然后将相应的字符串转换为整数。

1)initially 
  1983 
  GodFather
  3
  33
  45 
  are all strings and stored in a vector of strings (vector<string>).

2)Then 1983(1st string is converted to integer using atoi) and last three strings are also converted to integers. Rest of the strings constitute the movie_name

以下代码是在假设输入文件已经过格式验证的情况下编写的。

// open the input file for reading
ifstream ifile(argv[1]);
string input_str;

//Read each line        
while(getline(ifile,input_str)) {
stringstream sstr(input_str);
vector<string> strs;
string str;
while(sstr>>str)
    strs.push_back(str);
    //use the vector of strings to initialize the variables
    // year, movie name and last three integers
            unsigned int num_of_strs = strs.size();

            //first string is year
    int year = atoi(strs[0].c_str());

            //last three strings are numbers
    int one_num = atoi(strs[num_of_strs-3].c_str());
    int two_num = atoi(strs[num_of_strs-2].c_str());
    int three_num = atoi(strs[num_of_strs-1].c_str());
    //rest correspond to movie name
    string movie_name("");
    //append the strings to form the movie_name
            for(unsigned int i=1;i<num_of_strs-4;i++)
        movie_name+=(strs[i]+string(" "));
        movie_name+=strs[i];

IMHO将文件中的分隔符从空格更改为其他字符,或者;或:将显着简化解析。 例如,如果稍后数据规范发生变化,而不是仅变化到最后三个,则最后三个或最后四个可以是整数,那么上面的代码将需要重大的重构。