Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 不正确的二进制文件读取_C - Fatal编程技术网

C 不正确的二进制文件读取

C 不正确的二进制文件读取,c,C,我是C语言的新手,正在尝试对.dat文件读写结构。添加数据时,我会看到.dat文件中的字符。但是,我无法读取数据,当代码应该为结构的每次出现输出“val”时,它什么也不输出 我已经查看了许多源代码,但是我找不到我的代码与这些源代码有什么不同 这个网站最初是用来了解如何做到这一点的 我用它来看看我的代码是如何被修复的,但解决方案没有帮助 我尝试更改while循环中的语句 struct person { int id; char lastName[15]; char fi

我是C语言的新手,正在尝试对.dat文件读写结构。添加数据时,我会看到.dat文件中的字符。但是,我无法读取数据,当代码应该为结构的每次出现输出“val”时,它什么也不输出

我已经查看了许多源代码,但是我找不到我的代码与这些源代码有什么不同

这个网站最初是用来了解如何做到这一点的

我用它来看看我的代码是如何被修复的,但解决方案没有帮助

我尝试更改while循环中的语句

struct person
{
    int id;
    char lastName[15];
    char firstName[15];
    char age[4];
};


int main(void) {
  //create new file
  FILE *fp = fopen("file.dat", "wb+");

  struct person a = {10, "Smith", "John", 25};
  fwrite(&a, sizeof(a), 1, fp);

  struct person b = {2, "Ali", "Jon", 12};
  fwrite(&b, sizeof(b), 1, fp);

 struct person c = {19, "Walter", "Martha", 82};
  fwrite(&c, sizeof(c), 1, fp);

  struct person p; 
  while(fread(&p, sizeof(p), 1, fp))
  printf("val");
}
目前,它应该打印3个“VAL”,因为有三个人被添加到dat文件中。但是,没有打印任何内容


感谢您的帮助。

当您写完记录后,文件指针(“光标”,即您正在读取/写入的位置)位于文件的末尾。在尝试从文件读取之前,必须使用
revind()
fseek()
fsetpos()
将该位置设置回文件的开头。

写入记录后,文件指针(“光标”,即您正在读取/写入的位置)位于文件的末尾。在尝试读取文件之前,必须使用
revind()
fseek()
fsetpos()
将该位置设置回文件的开始位置。

如果要回读和打印,请在使用
fpos\u t
fgetpos()写入文件之前尝试捕获文件的开始位置。写入文件后,使用
fsetpos()
设置初始位置,并使用
fget()
读取内容并打印。检查修改后的代码,如下所示-

#include<stdio.h>
#include<stdlib.h>

struct person
{
    int id;
    char lastName[15];
    char firstName[15];
    char age[4];
};


int main(void) {
  //create new file
  FILE *fp = fopen("file.dat", "wb+");
  fpos_t position;


  struct person a = {10, "Smith", "John", "25"};
  fwrite(&a, sizeof(a), 1, fp);

  struct person b = {2, "Ali", "Jon", "12"};
  fwrite(&b, sizeof(b), 1, fp);

  struct person c = {19, "Walter", "Martha", "82"};
  fwrite(&c, sizeof(c), 1, fp);

  fseek(fp, 0, SEEK_SET);

  struct person p; 
  while(fread((void *)&p, sizeof(p),1,fp)==1)
  {
    printf("%d\n",p.id);
    printf("%s\n",p.lastName);
    printf("%s\n",p.firstName);
    printf("%s\n",p.age);    
    printf("\n");
  }
}
#包括
#包括
结构人
{
int-id;
char lastName[15];
charfirstname[15];
焦龄[4];
};
内部主(空){
//创建新文件
FILE*fp=fopen(“FILE.dat”、“wb+”);
fpos_t位置;
结构人a={10,“史密斯”,“约翰”,“25”};
fwrite(&a,sizeof(a),1,fp);
结构人b={2,“阿里”,“乔恩”,“12”};
fwrite&b,sizeof(b),1,fp);
结构人c={19,“沃尔特”,“玛莎”,“82”};
fwrite&c,sizeof(c),1,fp);
fseek(fp,0,SEEK_集);
结构人p;
而(fread((void*)&p,sizeof(p),1,fp)==1)
{
printf(“%d\n”,p.id);
printf(“%s\n”,p.lastName);
printf(“%s\n”,p.firstName);
printf(“%s\n”,p.age);
printf(“\n”);
}
}

如果要回读并打印,请在使用
fpos\u t
fgetpos()
写入文件之前尝试捕获文件的开始位置。写入文件后,使用
fsetpos()
设置初始位置,并使用
fget()
读取内容并打印。检查修改后的代码,如下所示-

#include<stdio.h>
#include<stdlib.h>

struct person
{
    int id;
    char lastName[15];
    char firstName[15];
    char age[4];
};


int main(void) {
  //create new file
  FILE *fp = fopen("file.dat", "wb+");
  fpos_t position;


  struct person a = {10, "Smith", "John", "25"};
  fwrite(&a, sizeof(a), 1, fp);

  struct person b = {2, "Ali", "Jon", "12"};
  fwrite(&b, sizeof(b), 1, fp);

  struct person c = {19, "Walter", "Martha", "82"};
  fwrite(&c, sizeof(c), 1, fp);

  fseek(fp, 0, SEEK_SET);

  struct person p; 
  while(fread((void *)&p, sizeof(p),1,fp)==1)
  {
    printf("%d\n",p.id);
    printf("%s\n",p.lastName);
    printf("%s\n",p.firstName);
    printf("%s\n",p.age);    
    printf("\n");
  }
}
#包括
#包括
结构人
{
int-id;
char lastName[15];
charfirstname[15];
焦龄[4];
};
内部主(空){
//创建新文件
FILE*fp=fopen(“FILE.dat”、“wb+”);
fpos_t位置;
结构人a={10,“史密斯”,“约翰”,“25”};
fwrite(&a,sizeof(a),1,fp);
结构人b={2,“阿里”,“乔恩”,“12”};
fwrite&b,sizeof(b),1,fp);
结构人c={19,“沃尔特”,“玛莎”,“82”};
fwrite&c,sizeof(c),1,fp);
fseek(fp,0,SEEK_集);
结构人p;
而(fread((void*)&p,sizeof(p),1,fp)==1)
{
printf(“%d\n”,p.id);
printf(“%s\n”,p.lastName);
printf(“%s\n”,p.firstName);
printf(“%s\n”,p.age);
printf(“\n”);
}
}

在读回文件(或)之前,您需要先阅读该文件。在读回文件(或)之前,您需要先阅读该文件。您的答案中有一些拼写错误,并且开头的描述与您的代码不匹配。另外,为什么您建议在代码中使用
fgetc()
?@swardfish逐字符读取二进制文件。谢谢,更正了错误。代码与描述同步-首先,使用
fpos\u t
fgetpos()
获取开始位置,然后在阅读之前使用
fsetpos()
将位置设置为初始位置,从现在起,为了更好地理解,对语句进行了语法修改。关于
fgetc()
它是读取文件的一种方式,使用时是否存在任何问题或风险?关于
fgetc()
它是读取文件的一种方式,使用时是否存在任何问题或风险?-风险?不,但我打赌apaul30想要回他的结构,而不是chars。由于结构包含char数组,写入文件的数据中很有可能有字符串,但当字符串没有数组的确切长度时,字符串后面也会有垃圾。好的,明白了。谢谢。谢谢@Swordfish修改了代码以删除
fgetc()
您的答案中有一些拼写错误,并且开头的描述与您的代码不匹配。另外,为什么您建议在代码中使用
fgetc()
?@swardfish逐字符读取二进制文件。谢谢,更正了错误。代码与描述同步-首先,使用
fpos\u t
fgetpos()
获取开始位置,然后在阅读之前使用
fsetpos()
将位置设置为初始位置,从现在起,为了更好地理解,对语句进行了语法修改。关于
fgetc()
它是读取文件的一种方式,使用时是否存在任何问题或风险?关于
fgetc()
它是读取文件的一种方式,使用时是否存在任何问题或风险?-风险?不,但我打赌apaul30想要回他的结构,而不是chars。由于结构包含char数组,写入文件的数据中很有可能有字符串,但当字符串没有数组的确切长度时,字符串后面也会有垃圾。好的,明白了。谢谢。谢谢@Swordfish修改了代码以删除
fgetc()