文件读写问题,如何将一个结构体数据一次性写入文件中?函数名是什么?

时间:2022-08-18 16:15:44
请教:如何将一个结构体所有数据一次性写入文件中,并且可以一次性将该类文件的信息读入一个结构体变量中。

    不知道是不是非标准文件函数:
int write(int handle, void *buf, int count); 
    write()函数把count个字节从buf指向的缓冲区写入与handle相连的文件中, 
返回值为实际写入的字节数
int read(int handle, void *buf, int count); 
    read()函数从handle(文件描述字)相连的文件中, 读取count个字节放到buf 
所指的缓冲区中, 返回值为实际所读字节数, 返回-1表示出错。返回0 表示文件 
结束。

8 个解决方案

#1



这个函数也可以用了,从你的结构开头开始写,写sizeof(...)那么大到文件中。

#2


你可以用c++中的fstream类来读写文件的啊。
如写文件 
ofstream out;
out.open(filename,ios::out);
if(!out.is_open())

#3


你可以用c++中的fstream类来读写文件的啊。
如写文件
struct A
{
    int a;
    int b;
};

int SaveFile(A a)

ofstream out;
out.open(filename,ios::out);
if(!out.is_open())
   return 0;

out.write((char *)&a,sizeof(A));

out.close();
return 1;
}
象上面这样就可以写结构到文件里啦。

#4


几乎所有的读写函数都可以了.
只不过写的时候要注以字节对齐的问题.
#pragma pack(1)
struct subData
{
char cSubdata[10];
};

struct data
{

int     id;
subData Sub;

char   cName[6];


};
#pragma pack()

int main(int argc, char* argv[])
{

data * pData = new data;

pData->id = 100;
char cArray[] ="sunwm";
memcpy(pData->cName, cArray, 6);
std::cout<<sizeof(data);
char CArray2[] ="wmsun sunwm";
memcpy(pData->Sub.cSubdata,CArray2,9);
pData->Sub.cSubdata[9] = 0;
    FILE * fstream;
fstream = fopen("abc.dat",                            // ファイルパス
                    "w"); 
if(fstream!= NULL)
{
fwrite(pData, sizeof(data), 1, fstream);
fclose(fstream);
}
FILE *fd;
fd = fopen("abc.dat",                            // ファイルパス
                    "r"); 
data aaa;
if(fd!= NULL)
{
fread(&aaa, sizeof(data), 1, fd);
fclose(fd);
}

std::cout<<sizeof(aaa)<<std::endl;
std::cout<<sizeof(aaa.cName)<<std::endl;
char str[9];
memcpy(str, aaa.Sub.cSubdata, 10);

//str[8] =0;
std::cout<<aaa.Sub.cSubdata<<std::endl;
std::cout<<str<<std::endl;
std::cout<<strlen(str)<<std::endl;

//int * p =reinterpret_cast <int*>(&aaa);
std::cout<<char(255)<<std::endl;

return 0;
}
有些复杂了,我以前测试用的,凑合着用吧,我没时间帮你改写了,对不起啊.

#5


如果要“一次”将结构写入文件可以用:
C:fwrite(&x, sizeof(x), 1, pFile);
C++:ofile.write(reinterpret_cast<const char*>(&x), sizeof(x));
读时:
C:fread(&x, sizeof(x), 1, pFile);
C++:ifile.read(reinterpret_cast<char *>(&x), sizeof(x));

不过“一次性”将结构写入文件的方式并不好,一旦写入代码和读取代码编译时的字节序和对齐方式不一致就会导致错误。应该分别把结构的每一个域写入文件。

#6


fstream base_file;
 struct Student 
{     int _num;
string      _name;
double _score;
}student;

base_file.open("f:\\Database.dat",ios::in|ios::out|ios::binary);//要用二进制打开一个文件,这文件先一定要存在
/记住做(char *)的转换
base_file.write((char *)&student,sizeof(Student));
base_file.read((char *)&student,sizeof(Student));

    write,read只用于二进制文件读写

#7


最好不要这样用,可移植性太差。字长、字节序、结构成员对齐等等都有限制。

#8


我觉得应该象MFC库实现的那样,让对象本身完成存入文件或从文件中读出的功能,这样更OO一些!

#1



这个函数也可以用了,从你的结构开头开始写,写sizeof(...)那么大到文件中。

#2


你可以用c++中的fstream类来读写文件的啊。
如写文件 
ofstream out;
out.open(filename,ios::out);
if(!out.is_open())

#3


你可以用c++中的fstream类来读写文件的啊。
如写文件
struct A
{
    int a;
    int b;
};

int SaveFile(A a)

ofstream out;
out.open(filename,ios::out);
if(!out.is_open())
   return 0;

out.write((char *)&a,sizeof(A));

out.close();
return 1;
}
象上面这样就可以写结构到文件里啦。

#4


几乎所有的读写函数都可以了.
只不过写的时候要注以字节对齐的问题.
#pragma pack(1)
struct subData
{
char cSubdata[10];
};

struct data
{

int     id;
subData Sub;

char   cName[6];


};
#pragma pack()

int main(int argc, char* argv[])
{

data * pData = new data;

pData->id = 100;
char cArray[] ="sunwm";
memcpy(pData->cName, cArray, 6);
std::cout<<sizeof(data);
char CArray2[] ="wmsun sunwm";
memcpy(pData->Sub.cSubdata,CArray2,9);
pData->Sub.cSubdata[9] = 0;
    FILE * fstream;
fstream = fopen("abc.dat",                            // ファイルパス
                    "w"); 
if(fstream!= NULL)
{
fwrite(pData, sizeof(data), 1, fstream);
fclose(fstream);
}
FILE *fd;
fd = fopen("abc.dat",                            // ファイルパス
                    "r"); 
data aaa;
if(fd!= NULL)
{
fread(&aaa, sizeof(data), 1, fd);
fclose(fd);
}

std::cout<<sizeof(aaa)<<std::endl;
std::cout<<sizeof(aaa.cName)<<std::endl;
char str[9];
memcpy(str, aaa.Sub.cSubdata, 10);

//str[8] =0;
std::cout<<aaa.Sub.cSubdata<<std::endl;
std::cout<<str<<std::endl;
std::cout<<strlen(str)<<std::endl;

//int * p =reinterpret_cast <int*>(&aaa);
std::cout<<char(255)<<std::endl;

return 0;
}
有些复杂了,我以前测试用的,凑合着用吧,我没时间帮你改写了,对不起啊.

#5


如果要“一次”将结构写入文件可以用:
C:fwrite(&x, sizeof(x), 1, pFile);
C++:ofile.write(reinterpret_cast<const char*>(&x), sizeof(x));
读时:
C:fread(&x, sizeof(x), 1, pFile);
C++:ifile.read(reinterpret_cast<char *>(&x), sizeof(x));

不过“一次性”将结构写入文件的方式并不好,一旦写入代码和读取代码编译时的字节序和对齐方式不一致就会导致错误。应该分别把结构的每一个域写入文件。

#6


fstream base_file;
 struct Student 
{     int _num;
string      _name;
double _score;
}student;

base_file.open("f:\\Database.dat",ios::in|ios::out|ios::binary);//要用二进制打开一个文件,这文件先一定要存在
/记住做(char *)的转换
base_file.write((char *)&student,sizeof(Student));
base_file.read((char *)&student,sizeof(Student));

    write,read只用于二进制文件读写

#7


最好不要这样用,可移植性太差。字长、字节序、结构成员对齐等等都有限制。

#8


我觉得应该象MFC库实现的那样,让对象本身完成存入文件或从文件中读出的功能,这样更OO一些!