C++ 如何在C++;然后读文件?
我是新来的。我有一些问题,如有任何帮助,将不胜感激。 我有一个struct,并使用write()将其写入文件C++ 如何在C++;然后读文件?,c++,buffer,readfile,C++,Buffer,Readfile,我是新来的。我有一些问题,如有任何帮助,将不胜感激。 我有一个struct,并使用write()将其写入文件 struct PointFull{ 双lat; 双离子; }; 完整项目; void*buffer=malloc(sizeof(项目)); int fd=开放(“输出”,O|u WRONLY | O|u CREAT,S|u IWUSR | S|u IRUSR); 如果(fd #include <iostream> #include <fstream> using
struct PointFull{
双lat;
双离子;
};
完整项目;
void*buffer=malloc(sizeof(项目));
int fd=开放(“输出”,O|u WRONLY | O|u CREAT,S|u IWUSR | S|u IRUSR);
如果(fd<0){
printf(“打开文件时出错”);
返回1;
}
memcpy(缓冲区和项目,大小(项目));
写入(fd2、缓冲区、大小(项));
现在我在硬盘中有一个名为“output”的文件,然后我想读取该文件以测试数据
int fd2 = open("output", O_RDONLY, S_IWUSR | S_IRUSR);
if (fd2 < 0) {
printf("Error opening file\n");
return 1;
}
void* bufferRead;
bufferRead = malloc(100);
read(fd2, bufferRead,100);
int fd2=open(“输出”,仅限O_RDONLY,S_IWUSR | S_IRUSR);
if(fd2<0){
printf(“打开文件时出错”);
返回1;
}
void*bufferRead;
bufferRead=malloc(100);
读取(fd2,缓冲读取,100);
目前,我有bufferRead,但我不知道如何读取buffer以将数据插入结构???任何帮助都会被理解。 < p>因为你已经标记了C++ +/p>
#include <iostream>
#include <fstream>
using namespace std;
struct PointFull {
double lat;
double lon;
PointFull(double lat_in = 0, double lon_in = 0)
: lat(lat_in), lon(lon_in) {}
};
int main() {
PointFull item(123123, 123123);
cout << "Writing to disk" << endl;
ofstream fout("saved_point.txt");
fout << item.lat << ' ' << item.lon;
fout.close();
cout << "Reading from disk" << endl;
PointFull item_from_disk;
ifstream fin("saved_point.txt");
fin >> item_from_disk.lat >> item_from_disk.lon;
fin.close();
cout << "From RAM and then disk" << endl;
cout << item.lat << ' ' << item.lon << endl;
cout << item_from_disk.lat << ' ' << item_from_disk.lon << endl;
return 0;
}
#包括
#包括
使用名称空间std;
结构点满{
双lat;
双离子;
满点(双横坐标=0,双纵坐标=0)
:lat(lat_-in),lon(lon_-in){
};
int main(){
完整项目(123123、123123);
库特
您宁愿分配一个大小为sizeof(PointFull)
的缓冲区。因为如果结构的大小发生变化,并且变得比您的硬编码大小更大,那么您将得到一个bug
除非您确实需要使用动态内存,否则请使用本地缓冲区。我假设在您的代码中,您并不真正需要分配内存。只是您可能很容易忘记释放内存,而当函数返回时,缓冲区会自动删除
- 您可以使用fwrite和fread将数据写入文件并从文件中读取。
下面是相同的示例代码
#include <stdio.h>
struct PointFull
{
int number;
char text[10];
double real_number;
};
int main()
{
struct PointFull data = {1, "Hello!", 3.14159}, read_data;
FILE *fout = fopen("file_path", "w");
fwrite(&data, sizeof(PointFull ), 1, fout);
// fprintf(fout, "%d %s %f",data.number, data.text, data.real_number);
fclose(fout);
FILE* fin = fopen("file_path", "r");
fread(&read_data, sizeof(PointFull ), 1, fin);
printf("%d %s %lf\n", read_data.number, read_data.text, read_data.real_number);
fclose(fin);
return 0;
}
#包括
结构点满
{
整数;
字符文本[10];
双实数;
};
int main()
{
struct PointFull data={1,“Hello!”,3.14159},读取数据;
FILE*fout=fopen(“文件路径”,“w”);
fwrite(和data),sizeof(PointFull),1,fout;
//fprintf(fout,“%d%s%f”,data.number,data.text,data.real\u number);
fclose(fout);
FILE*fin=fopen(“文件路径”,“r”);
fread(读取和读取数据,sizeof(PointFull),1,fin);
printf(“%d%s%lf\n”,read\u data.number,read\u data.text,read\u data.real\u number);
财务总监(财务);
返回0;
}
- 如果使用fwrite,数据将以二进制或ascii格式写入。要读取该数据,必须使用fRad
- 如果您使用fprintf和fscanf,数据将以可编辑格式存储
可以直接读或写<代码>项目< /C>,不需要经过中间缓冲区。首先,我认为C++中没有很多合法的用例,例如“C++”或“代码”> C++。你想学习C还是C++?@ CasignCyo:我知道一个。如果分配失败,<代码> Malc 返回空指针,这是VER。很容易测试;防范失败的构造函数要麻烦得多。@Beta很酷。但是你不能从new
捕获异常吗?我不认为处理会那么复杂。谢谢你的回答。使用fd和ofstream有什么不同。我认为fd更快。如果我仍然使用缓冲区,如何读取da来自缓冲区的ta?当我的结构有100个成员时,这不是一个好的解决方案…谢谢你的回答。你的方法更容易做到,但我想知道使用fd进行写和读比使用fread fwrite?main更快ậ这是一个可移植性与安全性的问题。请参阅:fwrite()
在任何平台上都受支持,因为它是标准的一部分;但是write()
不是。另一方面,C-api类似于fwrite()
使用指针,因此您可能会在某个地方遇到null ptr引用的危险,这将导致崩溃。像write()
这样的Posix函数没有这样的问题。
int fd2 = open("output", O_RDONLY, S_IWUSR | S_IRUSR);
if (fd2 < 0) {
printf("Error opening file\n");
return 1;
}
char bufferRead[sizeof(PointFull)];
read(fd2, bufferRead, sizeof(bufferRead));
//Now as you've read it, just cast the memory to struct, and assign it
item = *reinterpret_cast<PointFull*>(bufferRead);
//okay, now item holds the file content, you no longer need the buffer
#pragma pack(push, 1) // exact fit - no padding
struct PointFull {
double lat;
double lon;
};
#pragma pack(pop) //back to whatever the previous packing mode was
#include <stdio.h>
struct PointFull
{
int number;
char text[10];
double real_number;
};
int main()
{
struct PointFull data = {1, "Hello!", 3.14159}, read_data;
FILE *fout = fopen("file_path", "w");
fwrite(&data, sizeof(PointFull ), 1, fout);
// fprintf(fout, "%d %s %f",data.number, data.text, data.real_number);
fclose(fout);
FILE* fin = fopen("file_path", "r");
fread(&read_data, sizeof(PointFull ), 1, fin);
printf("%d %s %lf\n", read_data.number, read_data.text, read_data.real_number);
fclose(fin);
return 0;
}