xihuazhaoshi_BLOG
Elvis-Liu
采纳率75%
2016-05-13 08:19 阅读 2.7k
已采纳

语言:c++ 从文本文档读取数据,并保存到struct中

各位,我想要从txt文本文档中读取三万行数据,每行两列,一列为小数,一列为整数,现用getline()逐行读取,并将每一行分割成两个数据,保存到struct中,这个struct有double型和int型两个变量,具体应该这么做,希望有人给出具体的代码,感激不尽。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

7条回答 默认 最新

  • 已采纳
    zhao4zhong1 赵4老师 2016-05-17 04:19

    乍看起来c++的cin、cout、ifstream、ofstream、istringstream、ostringstream在输入、输出上比c的scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf简单,不用格式控制符!
    但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。
    摒弃cin、cout、ifstream、ofstream、istringstream、ostringstream!
    使用scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf。

    点赞 评论 复制链接分享
  • shimucheng shimucheng 2016-05-13 08:25

    1.将整行作为一个String读出来
    String str = getline();
    2.用区分两列的符号(" ",";\t"等)将这个String分割成String数组
    String[] strs = str.split(" ");
    3.Integer.parseInt(),Double.parseDouble()转换对应的值
    int a = Integer.parseInt(strs[0]);
    double b = Double.parseDouble(strs[1]);
    4.转换过的值放入对应位置
    struct.setInt(a);
    struct.setDouble(b);

    点赞 评论 复制链接分享
  • lbcab lbcab 2016-05-13 08:29

    使用什么语言写?
    java中:
    try {
    Scanner in = new Scanner(new File("txt 文件名"));

            while (in.hasNextLine()) {
                String str = in.nextLine();
                                //获取到每行数据, 然后根据文本中数据的分割字符来取出两个数据来
                                //例如你是用单个空格分割那么
                                // String[] sp = str.split(" "); 获取两个数, string[0] 为小数, string[1]为整数
                                //然后转成小数类型, 整数类型存到struct中即可
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
    
        c++:
    

    ifstream in("main.txt");
    string s;
    while(getline(in,s)) { //逐行读取数据并存于s中,直至数据全部读取
    //然后与上面操作一样
    }

    点赞 评论 复制链接分享
  • herozhangbz herozhangbz 2016-05-13 09:32

    你的struct 是什么?是你声明的结构的类?那你是实例化三万多个这样的数组吗 ?这个你考虑清楚。假如你实例化了一个st
    struct st =new struct[();
    string str=getline();
    st.double=double.parse(str.split(' ')[0]);//假如你的数据是一个空格隔开的
    st.int=int.parse(str.split(' ')[1]);
    这样你读取的一行数据已经放到了st里面。其他行的数据你可以试试声明 struct st[40000]然后使用while循环进行上面的操作

    点赞 评论 复制链接分享
  • xihuazhaoshi_BLOG Elvis-Liu 2016-05-13 09:57

    const char* str = "abc.txt";
    ifstream curveFile;
    curveFile.open(str);
    struct Point
    {
    double x;
    int y;
    };
    std::vector pointall;
    while (!curveFile.eof())
    {
    char tempdata[30];
    Point temppoint;
    curveFile.getline(tempdata,'\n');
    sscanf_s(tempdata,"%lf %d",&temppoint.x,&temppoint.y);
    pointall.push_back(temppoint);
    }

    std::vector<Point>::iterator it = pointall.begin();
    for (;it != pointall.end();++it)
    {
        cout<<it->x<<"  "<<it->y<<endl;
    }
    curveFile.close();
    
    
    
    点赞 评论 复制链接分享
  • ml422524 玉墨冰凌 2016-05-13 10:32

    #include
    #include
    #include
    #include

    struct Num
    {
    double d;
    int i;
    Num(double dd, int ii) :d(dd), i(ii) {}
    };

    std::ostream &println(std::ostream &os,std::vector &obj)
    {
    for (std::vector::const_iterator it = obj.cbegin(); it != obj.cend(); ++it)
    os << it->d << " " << it->i << std::endl;
    return os;
    }
    int main()
    {
    std::ifstream in("m.txt");
    std::istringstream istr;
    std::string str;
    double d;
    int i;
    std::vector vobj;
    while (getline(in, str))
    {
    istr.str(str);
    istr >> d >> i;
    istr.clear();
    vobj.push_back(Num(d,i));
    }

    println(std::cout, vobj);
    
    
    return 0;
    

    }

    点赞 评论 复制链接分享
  • ml422524 玉墨冰凌 2016-05-13 10:36

    1、vector应改为vector
    2、头文件是这几个:
    iostream
    fstream
    sstream
    vector

    点赞 评论 复制链接分享

相关推荐