C++ 如何在C++;然后读文件?

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,并使用write()将其写入文件

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