cpp: 小综合,读取文本中的数字与字符串

看一个小案例,怎么从文本文件中读取内容,并将读到的数字行,保持为数字,读到的字符串,保存为字符串。
比如有一个文件donation.txt,里面的内容是:

4
Sam Stone
2000
Freida Flass
100500
Tammy Tubbs
5000
Rich Raptor
55000

这种要怎么读呢? 怎么处理这种混合的输入?

我是全部按照字符去读取的,然后将每行存到一个字符串中,整体存到一个vector中,然后再遍历vector,去判断每行是字符串还是数字,然后分别去处理。其实我没有判断。

c++的角度看,这当然不能算是好的处理方式,因为完全没有考虑内存,这样做肯定消耗的内存比较大。

下面是我的实现:

#include <iostream>
#include <fstream>
#include <array>
#include <vector>
#include <sstream>

using namespace std;

int main() {

    ifstream inFile;
    inFile.open("donation.txt");

    char *line = new char[100];
    string li;
    char ch;

    int pos = 0;
    vector<string> lines;
    while (inFile && inFile.get(ch)) {
        if (ch == '\n') {
            line[pos] = '\0';
            li = line;
//            cout << "\nline: " << li << endl;
            pos = 0;
            lines.push_back(li); // 将文件按行存
            continue;
        }
        line[pos] = ch;
        li[pos] = ch;
//        cout << ch;
        pos++;
    }
    line[pos] = '\0';
    li = line;
    if (li.size() > 0)
        lines.push_back(li);// 将文件按行存--最后一行
    // 最后一行没有回车就会>0,否则是空行,不要存
    inFile.close();


    cout << "result:\n";
    int num = 0;
    double donate = 0;
    string name;

    for (unsigned int i = 0; i < lines.size(); ++i) {
        basic_string<char, char_traits<char>, allocator<char>> &item = lines.at(i);
//        cout << item << endl;
        stringstream ss(item);

        if (i == 0) {
            ss >> num; // string 2 int
        } else if (i % 2 != 0) {
//            ss >> name;
            name = item;
        } else if (i % 2 == 0) {
            ss >> donate; // string 2 double
        }
    }
    cout << num << "," << name << "," << donate << endl;
    delete[]line;
    return 0;
}

输出如下:
4,Rich Raptor,55000

通过输出可以看到,已经完成了将文本文件全部读取,并按行存到vector中了,然后也顺利地解析了数字的字符串。(考虑到健壮性,应该加判断的,这里不加了。)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值