File C++;加载对象数组时程序崩溃 你好,我试图用C++中的文本文件填充一个对象数组,但是每次运行程序时都有一个崩溃。我在这里的方向对吗?还有更有效的方法吗

File C++;加载对象数组时程序崩溃 你好,我试图用C++中的文本文件填充一个对象数组,但是每次运行程序时都有一个崩溃。我在这里的方向对吗?还有更有效的方法吗,file,io,File,Io,main.cpp #include <iostream> #include <string> #include <stdio.h> #include <fstream> #include "Item.h" using namespace std; void readItems(FILE *products, Item pList[]); FILE *products; int main() { Item pList[5];

main.cpp

#include <iostream>
#include <string>
#include <stdio.h>
#include <fstream>
#include "Item.h"

using namespace std;

void readItems(FILE *products, Item pList[]);

FILE *products;
int main()
{

    Item pList[5];

    readItems(products,pList);
    return 0;
}

void readItems(FILE *products, Item pList[]){

products = fopen("data.txt", "r");

int i = 0;
fread(&pList[i], sizeof(pList), 1, products);
while (!feof(products))
{
    i++;
fread (&pList[i], sizeof(pList), 1, products);

}

fclose(products);
}
#包括
#包括
#包括
#包括
#包括“项目h”
使用名称空间std;
作废读取项目(文件*产品,项目pList[]);
档案*产品;
int main()
{
项目pList[5];
读取项目(产品、pList);
返回0;
}
作废读取项目(文件*产品,项目pList[]){
products=fopen(“data.txt”、“r”);
int i=0;
fread(和pList[i],sizeof(pList),1,产品);
而(!feof(产品))
{
i++;
fread(和pList[i],sizeof(pList),1,产品);
}
fclose(产品);
}
项目1.cpp

#include "Item.h"
#include <stdio.h>
#include <string>
#include <conio.h>
#include <iostream>

using namespace std;

Item::Item()
{
    code = 0;
    description = "";
    price = 0;
}

Item::Item(int code1,string description1,float price1)
{
    code = code1;
    description = description1;
    price = price1;
}

void Item::printData(){
    cout<<endl<<"Code:"<<code<<"\tName:"<<description<<"\tPrice:"<<price;
}

void Item::setData(int code1,string description1,float price1){
    code = code1;
    description = description1;
    price = price1;
}

int Item::getCode(){
    return code;
}

float Item::getPrice(){
    return price;
}

Item::~Item()
{
    //dtor
}
#包括“Item.h”
#包括
#包括
#包括
#包括
使用名称空间std;
Item::Item()
{
代码=0;
description=“”;
价格=0;
}
Item::Item(整数代码1,字符串描述1,浮动价格1)
{
代码=代码1;
描述=描述1;
价格=价格1;
}
无效项::printData(){
不能试着更换

while (!feof(products))
{
    i++;
fread (&pList[i], sizeof(pList), 1, products);

}

while(!feof(产品)和&(i<5))
{
i++;
fread(和pList[i],sizeof(pList),1,产品);
}

这是我填充数组的方式。我认为你会得到奇怪的符号,因为fread(&list[i],sizeof(list[i]),1,products);从文件中读取一个sizeof(list[i])字节的元素,所以你在数组中得到一个元素,其他任何东西都是垃圾。解决方法是设置不同的大小(字节)读取,分为三个元素。因此请尝试fread(&list[i],5,3,fin)。我不确定,我在代码中使用了fscanf,工作起来很有魅力

void readItems(FILE *fin,Item list[])
{
    int i=0;
    int code;
    char description[15];
    float price;

    fin=fopen("items.txt", "r");

    fscanf (fin,"%i %15[a-zA-Z ]s",&code,description);
    fscanf (fin,"%f",&price);
    list[i].setData(code,description,price);

    while (!feof(fin)&&i<5)
    {
       i++;
       fscanf (fin,"%i %15[a-zA-Z ]s",&code,description);
       fscanf (fin,"%f",&price);
       list[i].setData(code,description,price);
    }
    fclose(fin);
}    
void readItems(文件*fin,项目列表[])
{
int i=0;
int代码;
字符描述[15];
浮动价格;
fin=fopen(“items.txt”、“r”);
fscanf(fin,“%i%15[a-zA-Z]s”&代码,说明);
fscanf(财务、%f和价格);
列表[i].setData(代码、说明、价格);

虽然(!feof(fin)和&i
fread
ing结构有机会使用POD类型;但是如果您有类似于
std::string
的东西,或者虚拟方法,或者在
项中有任何特定于C++的东西,您必须[de]一个字段一个字段地序列化。
Item.h
丢失了,所以我不得不猜测……但不是
description
std::string吗?(好吧,即使
description
char*
),它还是会崩溃的)我的伙伴们……我没钱了……:(
while (!feof(products) && (i < 5))
{
    i++;
fread (&pList[i], sizeof(pList), 1, products);

}
void readItems(FILE *fin,Item list[])
{
    int i=0;
    int code;
    char description[15];
    float price;

    fin=fopen("items.txt", "r");

    fscanf (fin,"%i %15[a-zA-Z ]s",&code,description);
    fscanf (fin,"%f",&price);
    list[i].setData(code,description,price);

    while (!feof(fin)&&i<5)
    {
       i++;
       fscanf (fin,"%i %15[a-zA-Z ]s",&code,description);
       fscanf (fin,"%f",&price);
       list[i].setData(code,description,price);
    }
    fclose(fin);
}