在C中读取/写入/修改结构
我从一个用户那里获取一些信息(姓名、地址、联系电话),并将其存储在一个结构中。然后我将其存储在以“r+”模式打开的文件中。我试着逐行阅读,看看我试图进入的条目是否已经存在,在这种情况下我退出。否则,我会将此条目附加到文件末尾。问题是,当我以“r+”模式打开文件时,它会给我分段错误 代码如下:在C中读取/写入/修改结构,c,struct,C,Struct,我从一个用户那里获取一些信息(姓名、地址、联系电话),并将其存储在一个结构中。然后我将其存储在以“r+”模式打开的文件中。我试着逐行阅读,看看我试图进入的条目是否已经存在,在这种情况下我退出。否则,我会将此条目附加到文件末尾。问题是,当我以“r+”模式打开文件时,它会给我分段错误 代码如下: struct cust{ char *frstnam; char *lastnam; char *cntact; char *add; }; 现在考虑这个函数。我在这个函数
struct cust{
char *frstnam;
char *lastnam;
char *cntact;
char *add;
};
现在考虑这个函数。我在这个函数中传递一个信息结构。它的任务是检查这个结构是否已经存在,或者将它附加到文件的末尾
void check(struct cust c)
{
struct cust cpy;
FILE *f;
f=fopen("Customer.txt","r+");
int num=0;
if (f!= NULL){
while (!feof(f)) {
num++;
fread(&cpy,sizeof(struct cust),1,f);
if ((cpy.frstnam==c.frstnam)&(cpy.lastnam==c.lastnam)&(cpy.cntact==c.cntact)&(cpy.add==c.add))
{
printf("Hi %s %s. Nice to meet you again. You live at %s and your contact number is %s\n", cpy.frstnam,cpy.lastnam,cpy.add,cpy.cntact);
return;
}
}
fwrite(&c,sizeof(struct cust),1,f);
fclose (f);
}
printf("number of lines read is %d\n",num);
}
问题是您的结构包含指向字符串的指针,而不是字符串本身。因此,FREADDING和FWWRITING将不起作用,因为指针值将被读取和写入,但在应用程序运行之间无效 一个简单的修复方法是将结构更改为:
struct cust{
char frstnam[25];
char lastnam[25];
char cntact[25];
char add[25];
};
这不是一个很好的解决方案,但它是一个解决方案,可能对您有用。问题在于您的结构包含指向字符串的指针,而不是字符串本身。因此,FREADDING和FWWRITING将不起作用,因为指针值将被读取和写入,但在应用程序运行之间无效 一个简单的修复方法是将结构更改为:
struct cust{
char frstnam[25];
char lastnam[25];
char cntact[25];
char add[25];
};
这不是一个很好的解决方案,但它是一个解决方案,可能对您有用。同样,以这种方式比较字符串也不起作用-这只是比较指针 您可能想要更像这样的东西:
if ( strcmp(cpy.frstnam,c.frstnam) == 0 && strcmp(cpy.lastnam,c.lastnam) == 0 ...
{
printf("Hi ...
return;
}
这将比较字符串数组的实际内容,而不是指针
而且“&”是按位的,而“&&”是逻辑的,您需要在这里使用。另外,以这种方式比较字符串是不起作用的-这只是比较指针 您可能想要更像这样的东西:
if ( strcmp(cpy.frstnam,c.frstnam) == 0 && strcmp(cpy.lastnam,c.lastnam) == 0 ...
{
printf("Hi ...
return;
}
这将比较字符串数组的实际内容,而不是指针
另外,&“是按位的,&&&”是逻辑和,您需要在此处输入。如果您找到匹配的联系人,您的当前代码将返回,而无需先关闭文件。最终,您可能会用完可用的文件描述符,对fopen的调用将失败。如果您找到了匹配的联系人,您的当前代码将返回,而无需先关闭文件。最终,您可能会用完可用的文件描述符,对fopen的调用将失败。这是真的,但这似乎不是分段错误的来源。这是真的,但这似乎不是分段错误的来源。