C++ 从文件中获取输入并将其保存到临时内存中?

C++ 从文件中获取输入并将其保存到临时内存中?,c++,file,C++,File,我有一个结构化数组,它最初是空的,有4种数据类型,其中有ing、string、2个int和1个float。我有一个保存在文本文件中的dvd标题和其他属性列表(另外3个,其中2个是int,最后一个是float),我需要将文本文件中的数据输入到我的结构中。这是我的代码,但似乎不起作用 do { for(int i=0;i<MAX_BOOKS;i++) { tempTitle= getl

我有一个结构化数组,它最初是空的,有4种数据类型,其中有ing、string、2个int和1个float。我有一个保存在文本文件中的dvd标题和其他属性列表(另外3个,其中2个是int,最后一个是float),我需要将文本文件中的数据输入到我的结构中。这是我的代码,但似乎不起作用

        do
        {
           for(int i=0;i<MAX_BOOKS;i++)
           {

                tempTitle= getline(myfile,line);
                temChapters = getline(myfile,line);
                tempReview = getline(myfile,line);
                tempPrice = getline(myfile,line);
           }
        }while(!myfile.eof());
do
{

对于(int i=0;i而言,从
getline
返回的是从中读取的流,而不是从中读取数据的字符串

您还将数据重复读取到同一位置(
),而不将其保存到任何位置

您的循环有缺陷(
而(!somefile.eof())
基本上总是被破坏)

您通常希望从重载
操作符>>
开始,从流中读取单个逻辑项,然后使用该项填充这些项的向量

// The structure of a single item:
struct item { 
    std::string title;
    int chapters;
    int review;
    int price;    
};

// read one item from a stream:
std::istream &operator>>(std::istream &is, item &i) { 
    std::getline(is, i.title);
    is >> i.chapters >> i.review >> i.price;
    is.ignore(4096, '\n'); // ignore through end of line.
    return is;
}

// create a vector of items from a stream of items:
std::vector<item> items((std::istream_iterator<item>(myfile)), 
                         std::istream_iterator<item>());
//单个项目的结构:
结构项{
std::字符串标题;
int章;
国际审查;
国际价格;
};
//从流中读取一项:
std::istream&operator>>(std::istream&is,item&i){
std::getline(is,i.title);
is>>i.chapters>>i.review>>i.price;
is.ignore(4096,“\n”);//通过行尾忽略。
回报是;
}
//从项目流创建项目向量:
std::vector items((std::istream_迭代器(myfile)),
std::istreamu迭代器();

getline
返回的是从中读取的流,而不是从中读取数据的字符串

您还将数据重复读取到同一位置(
),而不将其保存到任何位置

您的循环有缺陷(
而(!somefile.eof())
基本上总是被破坏)

您通常希望从重载
操作符>>
开始,从流中读取单个逻辑项,然后使用该项填充这些项的向量

// The structure of a single item:
struct item { 
    std::string title;
    int chapters;
    int review;
    int price;    
};

// read one item from a stream:
std::istream &operator>>(std::istream &is, item &i) { 
    std::getline(is, i.title);
    is >> i.chapters >> i.review >> i.price;
    is.ignore(4096, '\n'); // ignore through end of line.
    return is;
}

// create a vector of items from a stream of items:
std::vector<item> items((std::istream_iterator<item>(myfile)), 
                         std::istream_iterator<item>());
//单个项目的结构:
结构项{
std::字符串标题;
int章;
国际审查;
国际价格;
};
//从流中读取一项:
std::istream&operator>>(std::istream&is,item&i){
std::getline(is,i.title);
is>>i.chapters>>i.review>>i.price;
is.ignore(4096,“\n”);//通过行尾忽略。
回报是;
}
//从项目流创建项目向量:
std::vector items((std::istream_迭代器(myfile)),
std::istreamu迭代器();

您应该这样构造它:

std::ifstream myfile("filename.dat");
std::string line;

while (getline(myfile, line))
{

    // you can use std::string::find(), std::string::at(), std::string::substr
    // to split the line into the necessary pieces

}

然后,您可以使用Jerry coffins answer将每个片段保存在
向量中

您应该这样构造它:

std::ifstream myfile("filename.dat");
std::string line;

while (getline(myfile, line))
{

    // you can use std::string::find(), std::string::at(), std::string::substr
    // to split the line into the necessary pieces

}

然后,你可以使用Jerry coffins answer将每个片段保存在一个
向量中

为什么嵌套循环?getline(myfile,line)总是一样的,为什么你希望它返回一次标题和一次章节?@pfnuesel是的,它返回了同样的东西并一直这样做,我想不出一种方法来获得一行又一行:(为什么是嵌套循环?getline(myfile,line)总是一样的,为什么你希望它返回一次标题和一次章节?@pfnuesel是的,它返回我同样的东西,并一直这样做,我想不出一种方法来获得一行又一行的内容:(那么更改我的值会使代码读成不同的行吗?@JoshuaJones:是的,你通过了吗(引用)一个项到
操作符>
,它将数据读入该
+1,但要小心混合
std::getline
操作符>
。后者将在输入流中留下一个
\n
,在下一次迭代中混淆前者。添加
是。忽略(std::numeric\u limits::max(),'\n'));
操作符>>(istream&,item&)的末尾ᵩ: 好的观点,尽管我不喜欢使用
std::numeric\u limits::max()
。如果用户打开了错误的文件,这可能会浪费大量时间读取无用的数据,很长一段时间后,文件显然是坏的,您应该给用户一条错误消息。@JerryCoffin数字4096是什么?您是否输入了一个大数字,以便文件读取到末尾?更改i的值是否会使代码读取到不同的值t行?@JoshuaJones:是的——你将一个项目(对)传递给
操作符>
,它将数据读入
项目
+1,但要小心混合
std::getline
操作符>
。后者会在输入流中留下一个
\n
,在下一次迭代中混淆前者。添加
是。忽略(std::numeric_limits::max(),'\n');
操作符>>(istream&,item&)
@Rob>的末尾ᵩ: 好的观点,尽管我不喜欢使用
std::numeric\u limits::max()
。如果用户打开了错误的文件,这可能会浪费大量时间读取无用的数据,很长一段时间后,文件显然是坏的,您应该给用户一条错误消息。@JerryCoffin数字4096是什么?您是否输入了一个大数字,以便文件读取到最后?