【问题标题】:How do read until eof without the core dumping?在没有核心转储的情况下如何读取直到 eof?
【发布时间】:2021-03-22 13:48:23
【问题描述】:

我目前正在尝试从头开始学习 Ai 以熟悉它是如何工作的(项目代码链接 here 我当前的问题是找到一种方法来停止第 20 行的 while 循环,一旦 eof 已经已达到。我尝试使用 fin.eof,使用它时得到的输出是“Segmentation fault (core dumped)”。我怎样才能让代码正常运行?

这是我的代码:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;

struct Match{
    vector<int> sitVal;
    vector<int> opVal1;
    vector<int> opVal2;
    vector<int> opVal3;
};
//fills chosen Match with data from file
void conData(string file, Match& sits){
    ifstream fin;
    fin.open(file);
    int jump;
    fin >> jump;
    int i = 0;
    while(true){
        fin >> sits.sitVal[i];
        if (!fin)
            break;
        fin >> sits.opVal1[i];
        fin >> sits.opVal2[i];
        fin >> sits.opVal3[i];
        i++;
    }
    //following is for testing
    cout << sits.sitVal[0];
    cout << sits.opVal1[0];
    cout << sits.opVal2[0];
    cout << sits.opVal3[0];
}

int main(){
    Match sits;
    conData("Data.txt", sits);
}

【问题讨论】:

  • 请在问题中提供minimal reproducible example,不要依赖外部链接
  • 你的向量都是空的,所以sits.sitVal[i]等有未定义的行为
  • @tadman 我认为struct rowData { int sitVal, opVal1, opVal2, opVal3; };std::vector&lt;rowData&gt; 更好。
  • fin &gt;&gt; sits.sitVal[i]; -- 改成fin &gt;&gt; sits.sitVal.at(i);,你就会发现seg faults的原因。

标签: c++ while-loop eof


【解决方案1】:

在写入数据读取之前,您必须添加读取数据的元素。

    while(true){
        // read first data
        int sitValTemp;
        fin >> sitValTemp;
        if (!fin)
            break;

        // add elements
        sits.sitVal.push_back(sitValTemp);
        sits.opVal1.push_back(0);
        sits.opVal2.push_back(0);
        sits.opVal3.push_back(0);

        // read rest data
        fin >> sits.opVal1[i];
        fin >> sits.opVal2[i];
        fin >> sits.opVal3[i];
        i++;
    }

【讨论】:

    猜你喜欢
    • 2011-04-11
    • 2012-05-22
    • 1970-01-01
    • 2018-01-31
    • 2012-05-15
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多