如果可以,我可以从文件中检索结构吗?

Posted

技术标签:

【中文标题】如果可以,我可以从文件中检索结构吗?【英文标题】:Can I retrieve a struct from a file if so how? 【发布时间】:2015-06-23 23:30:45 【问题描述】:

所以,我有这个结构数组和一个文件,我需要将所有信息复制到结构中,我可以做这样的事情吗?如果不是,我该怎么做?

#include <stdio.h>
#include <iostream>

using namespace std;

typedef struct
      int x;
      int y;
      int z;
coordinates;

int main()
     coordinates coordinate[100];
     int i = 0;
     FILE *f;
     f = fopen("file.file","rb");

     if(!f)
        cout << "Error";
        return 0;
     

     while(!feof(f))
        fread(coordinate[i],sizeof(coordinates),1,f);
        i++;
     
     return 0;

【问题讨论】:

了解如何重载流运算符并使用std::fstream。还有while(feof(..)) 或任何类似的错误。 我不能用fstream,老师很烦,不让我们用她没教过的功能 “我可以做这样的事情吗”?如果你尝试,你会自己回答这个问题。不要忘记将wb 更改为rb fread(coordinate[i],sizeof(coordinates),1,f); sizeof(coordinates) 将尝试读取 100 个坐标。使用sizeof(coordinates[0]) 您想在 C 或 C++ 中使用哪种语言。如何完成这个看似简单的任务会产生很大的不同。 【参考方案1】:

如果您使用的是 C++(顺便说一下,这是一种与 C 完全不同的语言)。您只需为该类定义输入运算符。

struct coordinates
      int x;
      int y;
      int z;

      // Personally I prefer serialization to a straight binary format.
      // It is easy to read and validate by a human
      // and not as brittle as a binary format when anything non
      // trivial happens.
      friend std::istream& operator>>(std::istream& str, coordinates& c)
      
           return str >> c.x >> c.y >> c.z;
      
      friend std::ostream& operator<<(std::ostream& str, coordinates const& c)
      
           return str << c.x << " " << c.y << " " << c.z << " ";
      
;

现在您可以简单地从文件中读取结构:

int main()

    std::ifstream data("file.file");

    coordinates  value;
    while(data >> value) 
       std::cout << "I have a set of cordinates\n";
    

    // To read them into an array (a vector is a resizable array available in C++)
    std::vector<coordinates>   vec;
    std::copy(std::istream_iterator<coordinates>(file),
              std::istream_iterator<coordinates>(),
              std::back_inserter(vec));

【讨论】:

【参考方案2】:

如何将结构写入和读取二进制文件

    typedef struct
      int x;
      int y;
      int z;
coordinates;

写入文件

 FILE *f;
 f = fopen("test.dat","wb");

 for(int i = 0; i < 3; i++)
 
    coordinates c;
    c.x = 0;
    c.y = 1;
    c.z= 2;
    fwrite(&c,sizeof(coordinates),1,f);
 

读回结构

 FILE *f;
 f = fopen("test.dat","rb");

 if(!f)
    cout << "Error";
    return 0;
 

 coordinates c;
 while(fread(&c,sizeof(coordinates),1,f))
 
    cout << c.x << " " << c.y << " "<< c.z << endl;
 

【讨论】:

【参考方案3】:

在 cord.txt 文件中使用分隔符,这样可以很容易地检索坐标。如果你有这种格式的文本文件,我的代码会很好用

cord.txt
4,5,6,
3,4,5,
7,8,9,   

根据上述文本文件格式的代码是

typedef struct 

 int x;
 int y;
 int z;
cord;

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

  cord cr[100];
  int i,j,k,l;
  j=0;k=0;l=0;
  char numbr[80];char numx[3];char numy[3];char numz[3];
  FILE *p;
  p = fopen("cord.txt","r");
  if(!p)  cout<<"File is missing\n"; 
  while(!feof(p))
  
    for(i=0;i<80;i++)
    numbr[i]=NULL;
    for(i=0;i<3;i++)
    
      numx[i]=NULL;
      numy[i]=NULL;
      numz[i]=NULL;
    

   fgets(numbr,80,p);
   for(i=0;i<strlen(numbr);i++)
   
      if(numbr[i]!=',')
      
          if(k==0) numx[l]=numbr[i];
          else if(k==1) numy[l]=numbr[i];
          else if(k==2) numz[l]=numbr[i];
          l=l+1;    
      
      else
      
          l=0;
          if(k==0)
          cr[j].x=atoi(numx);k=k+1;
          else if(k==1)
          cr[j].y=atoi(numy);k=k+1;
          else if(k==2)
          cr[j].z=atoi(numz);k=0;break;
      
    
   j=j+1;    

fclose(p);

for(i=0;i<j;i++)
    
   cout<<cr[i].x<<" "<<cr[i].y<<" "<<cr[i].z<<endl;
 
cout<<"\n";
return EXIT_SUCCESS;

输出将是 4,5,6, 3,4,5, 7,8,9

【讨论】:

1.这与从文件中读取结构无关。 2. 关于while(!feof(p)),请阅读***.com/questions/5431941/…。 TL;DR 你认为 FILE 在读取某些文件之前如何知道它位于文件末尾?【参考方案4】:

如果可以,我可以从文件中检索结构吗?

是的,你可以。您可以使用readwrite 方法来执行此操作。打开文件并以二进制模式写入结构。然后您可以使用 read 方法以二进制模式从文件中读取。

您可以使用write方法将结构直接以二进制模式写入文件:

#include <iostream>
#include <fstream>
using namespace std;

struct Player 
    int age;
    int score;
;

int main()

    // You can write a structure directly into a file.
    // Create an instance of 'Player':
    Player rec;
    rec.age = 10;
    rec.score = 900;

    // Create out file
    fstream out_file("rec.bin",
                     ios::trunc | ios::binary | ios::in | ios::out
                     );

    // write the whole structure into the file
    out_file.write(reinterpret_cast<char*>( &rec ),
                   sizeof( rec )
                   );

我们在 write 和 read 方法中将类型转换为char*,因为 write 方法按顺序逐一写入每个字符、每个字节。因此我们强制转换为char* 以直接引用这组字节。


要读取文件,请使用 read 方法。 下面是一个读取我们刚刚写入文件rec.binstruct的示例:

#include <iostream>
#include <fstream>
using namespace std;

struct Player 
    int age;
    int score;
;

int main()

    fstream in_file("rec.bin", ios::binary | ios::in | ios::out);

    Player in_rec;

    // read in age
    if ( !in_file.read(
          reinterpret_cast<char*>( &in_rec.age ),
          sizeof( in_rec.age )
    ))
    
        // handle error
    

    // read in score
    if ( !in_file.read(
          reinterpret_cast<char*>( &in_rec.score ),
          sizeof( in_rec.score )
    ))
    
        // handle error
    

    cout << in_rec.age << endl;
    cout << in_rec.score << endl;

输出:

10
900

【讨论】:

【参考方案5】:

将结构写入文件(或更一般地,流)的过程称为序列化。你可以用二进制(这很困难)或文本来做。以下代码对类似的数据结构执行文本序列化。

int read_coords (FILE * f, coord_t * result);
void write_coords (FILE * f, coord_t const * write_me);

/**
 * Reads a coordinate in the form x,y,z from f into result.
 * Returns non-zero on success
 */
int read_coords (FILE * f, coord_t * result)

  // Leading spaces in scanf cause us to elegantly handle weird whitespace
  int read = fscanf (f, " %d , %d , %d", &result->x, &result->y, &result->z);

  return read == 3;


void write_coords (FILE * f, coord_t const * result)

  fprintf (f, "%d, %d, %d\n", result->x, result->y, result->z);


int main (void)

  coord_t coord;

  printf ("Gimme Coords: ");
  if (read_coords (stdin, &coord))
  
    printf ("I got: ");
    write_coords(stdout, &coord);
  
  else
  
    printf ("I had an error reading those coords.");
  

  return 0;

PS,看起来你在 C 类。我建议暂时避免。您可以在同一个程序中混合和匹配不同的 I/O 方法,但这会使事情变得混乱。

【讨论】:

以上是关于如果可以,我可以从文件中检索结构吗?的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL 可以从外部共享文件夹中检索文件吗?

我可以在没有 .bak 文件的情况下检索数据吗

我们可以从 Android 中的 Google Drive API 检索数据吗?

我可以使用两个微调器从我命名为 dist.js 的 javascript 文件中检索数据吗

我可以从 jQuery DataTable 中检索列/搜索特定数据吗?

我可以从 Spring Security Oauth 中检索访问令牌吗?