这是一个非常原始的问题,所以我认为解决方案不应该很难,但我没有找到一种方法如何简单地做到这一点,我也没有总结它实际上是在互联网上找到它。所以回答这个问题,我有一个这样的信息文件:
1988 Godfather 3 33 42
1991 Dance with Wolves 3 35 43
1992 Silence of the lambs 3 33 44
我要求将所有信息都放在数据结构中,因此我们可以说它是int year
,string name
以及另外三种int
类型的数字。但我怎么知道我读的下一件事是不是数字?我永远不知道这个词有多长。
提前感谢那些花时间解决这个原始问题的人。 :)
编辑:不要考虑标题中包含数字的电影。
答案 0 :(得分:2)
当你去尝试解析其他电影时,你会遇到一些重大问题,例如Free Willy 2。
您可以尝试将其视为std :: stringstream,并依赖最后三个块作为您正在寻找的数据,而不是使用正则表达式进行推广。
答案 1 :(得分:1)
答案 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将文件中的分隔符从空格更改为其他字符,或者;或:将显着简化解析。 例如,如果稍后数据规范发生变化,而不是仅变化到最后三个,则最后三个或最后四个可以是整数,那么上面的代码将需要重大的重构。