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

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

7个回答

乍看起来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。

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);

xihuazhaoshi_BLOG
Elvis-Liu 好的
大约 4 年之前 回复

使用什么语言写?
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中,直至数据全部读取
//然后与上面操作一样
}

xihuazhaoshi_BLOG
Elvis-Liu 我在下面贴出了我写的,能跑起来,不能显示读取,大神看看啥情况
大约 4 年之前 回复
lbcab
lbcab 回复Elvis-Liu: c++的读取程序我也说了, 每读取一行解析,保存到struct中, 用vector或list存
大约 4 年之前 回复
xihuazhaoshi_BLOG
Elvis-Liu 使用c++ 这个倒忘了说了 抱歉
大约 4 年之前 回复

你的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循环进行上面的操作

herozhangbz
herozhangbz 没注意看……原来你是要c++啊,我给的是c#,可能帮不到你
大约 4 年之前 回复
xihuazhaoshi_BLOG
Elvis-Liu 我是想的用临时struct变量来保存这个值,在循环里将这个临时变量push_back到容器中
大约 4 年之前 回复

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();

#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;

}

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

xihuazhaoshi_BLOG
Elvis-Liu 感谢回答
大约 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问