Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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_File_Binary_Access Violation - Fatal编程技术网

在C中从二进制文件读取字符串时发生访问冲突

在C中从二进制文件读取字符串时发生访问冲突,c,file,binary,access-violation,C,File,Binary,Access Violation,学生程序员在这里。从C中的二进制文件读取输入时遇到问题。文件中存储的数据是如下所示的结构: typedef struct reserve{ char *name; char *ic; int room_number; } Reserve; 我将结构写入二进制文件时没有问题。以下是我为写入文件而编写的代码: void reg_new() //Make a new reservation { Reserve newReserve = {"", "", 0};

学生程序员在这里。从C中的二进制文件读取输入时遇到问题。文件中存储的数据是如下所示的结构:

typedef struct reserve{
    char *name;
    char *ic;
    int room_number;
} Reserve;
我将结构写入二进制文件时没有问题。以下是我为写入文件而编写的代码:

void reg_new() //Make a new reservation
{
    Reserve newReserve = {"", "", 0};
    char name[NAMEFIELD], ic[ICFIELD];
    int room_number;
    FILE *resvptr;

    scanf_s("%s", name, NAMEFIELD);
    scanf_s("%s", ic, ICFIELD);
    scanf_s("%d", &room_number);

    newReserve.name = name;
    newReserve.ic = ic;
    newReserve.room_number=room_number;

resvptr = fopen("reservations.dat", "wb");
fwrite(&newReserve, sizeof(Reserve), 1, resvptr);
fclose(resvptr);

}
void reg_view() //view a reservation.
{
FILE *seekptr;
Reserve viewReserve = {"", "", 0};
int read;

if ( (seekptr = fopen("reservations.dat", "rb")) == NULL)
{
    puts("Error: file could not be found.");
}
else
{
    while ( !feof(seekptr))
    {
        read = fread(&viewReserve, sizeof(Reserve), 1, seekptr);

        if(read != 0)
        {
        printf("Name: %s\nIC number: %s\nRoom Number: %d\n", viewReserve.name, viewReserve.ic, viewReserve.room_number);
        }
    }
    fclose(seekptr);
}
以及从文件中读取的代码:

void reg_new() //Make a new reservation
{
    Reserve newReserve = {"", "", 0};
    char name[NAMEFIELD], ic[ICFIELD];
    int room_number;
    FILE *resvptr;

    scanf_s("%s", name, NAMEFIELD);
    scanf_s("%s", ic, ICFIELD);
    scanf_s("%d", &room_number);

    newReserve.name = name;
    newReserve.ic = ic;
    newReserve.room_number=room_number;

resvptr = fopen("reservations.dat", "wb");
fwrite(&newReserve, sizeof(Reserve), 1, resvptr);
fclose(resvptr);

}
void reg_view() //view a reservation.
{
FILE *seekptr;
Reserve viewReserve = {"", "", 0};
int read;

if ( (seekptr = fopen("reservations.dat", "rb")) == NULL)
{
    puts("Error: file could not be found.");
}
else
{
    while ( !feof(seekptr))
    {
        read = fread(&viewReserve, sizeof(Reserve), 1, seekptr);

        if(read != 0)
        {
        printf("Name: %s\nIC number: %s\nRoom Number: %d\n", viewReserve.name, viewReserve.ic, viewReserve.room_number);
        }
    }
    fclose(seekptr);
}
写入二进制文件并访问函数进行读取后,房间号(int值)立即可以正常读取,但两个字符串(名称和IC号)作为垃圾字符读取。随后,关闭并重新启动程序,然后尝试读取文件将导致访问冲突和错误指针错误


问题在于从文件中读取字符串。我怀疑内存泄漏,但我不能肯定…有人能帮忙吗?谢谢。

该结构由整数和两个数组(指针)的地址组成。当你把它写出来并读回时,你是在读和写字符数组的地址,而不是它们的内容。您需要修改例程以写入和读取内容(包括长度),并在读回内容时分配存储来保存内容。

该结构由整数和两个数组(指针)的地址组成。当你把它写出来并读回时,你是在读和写字符数组的地址,而不是它们的内容。您需要修改例程以写入和读取内容(包括长度),并在读回内容时分配存储以保存内容。

您正在写入指向文件的指针,而不是实际数据。当您从文件中读取指针时,它只是一个您可能无权访问的内存地址,即使您在编写文件的同一过程中这样做(因为它实际上是指向函数作用域堆栈变量的指针)

如果要以这种方式存储记录,请让函数存储实际的字符串数据,而不是指针:

typedef struct reserve{
    char name[NAMEFIELD];
    char ic[ICFIELD];
    int room_number;
} Reserve;
只要这样做:

scanf_s("%s", newReserve.name, NAMEFIELD);
scanf_s("%s", newReserve.ic, ICFIELD);
scanf_s("%d", &newReserve.room_number);

您正在写入指向文件的指针,而不是实际数据。当您从文件中读取指针时,它只是一个您可能无权访问的内存地址,即使您在编写文件的同一过程中这样做(因为它实际上是指向函数作用域堆栈变量的指针)

如果要以这种方式存储记录,请让函数存储实际的字符串数据,而不是指针:

typedef struct reserve{
    char name[NAMEFIELD];
    char ic[ICFIELD];
    int room_number;
} Reserve;
只要这样做:

scanf_s("%s", newReserve.name, NAMEFIELD);
scanf_s("%s", newReserve.ic, ICFIELD);
scanf_s("%d", &newReserve.room_number);

啊…谢谢,我不知道我在写一个指向文件的指针。我以为写一个char*会把内容写到文件中。啊……谢谢,我不知道我在写一个指向文件的指针。我以为写一个char*会把内容写到文件中。