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