加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c将文件中的行解析为流

发布时间:2020-12-16 09:46:19 所属栏目:百科 来源:网络整理
导读:我想解析一个逐行描述一组数据的文件.每个数据由3或4个参数组成:int int float(optional)string. 我打开文件ifstream inFile并在while循环中使用它 while (inFile) { string line; getline(inFile,line); istringstream iss(line); char strInput[256]; iss
我想解析一个逐行描述一组数据的文件.每个数据由3或4个参数组成:int int float(optional)string.

我打开文件ifstream inFile并在while循环中使用它

while (inFile) {

    string line;
    getline(inFile,line);
    istringstream iss(line);


    char strInput[256];

    iss >> strInput;
    int i = atoi(strInput);

    iss >> strInput;
    int j = atoi(strInput);

    iss >> strInput;
    float k = atoi(strInput);

    iss >> strInput;

    cout << i << j << k << strInput << endl;*/


}

问题是最后一个参数是可选的,所以当它不存在时我可能会遇到错误.如何提前检查每个数据的参数数量?

此外,

string line;
    getline(inFile,line);
    istringstream iss(line);

看起来有点红,我怎么能简单地说呢?

解决方法

在这种情况下使用惯用法,它变得更加简单:

for (std::string line; getline(inFile,line); ) {
    std::istringstream iss(line);
    int i;
    int j;
    float k;

    if (!(iss >> i >> j)) {
        //Failed to extract the required elements
        //This is an error
    }

    if (!(iss >> k)) {
        //Failed to extract the optional element
        //This is not an error -- you just don't have a third parameter
    }
}

顺便说一句,atoi有一些非常不受欢迎的歧义,除非0不是你正在解析的字符串的可能值.由于atoi在出错时返回0,因此您无法知道返回值0是否成功解析值为0的字符串,或者如果它是错误的,除非您对原始字符串进行了一些相当费力的检查.

尝试坚持使用流,但在需要回归到atoi类型功能的情况下,请使用strtoX系列函数(strtoi,strtol,strtof等).或者,更好的是,如果您使用的是C 11,请使用stoX系列功能.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读