【问题标题】:Access violation when reading strings from binary file in C从 C 中的二进制文件读取字符串时访问冲突
【发布时间】:2013-11-26 23:20:37
【问题描述】:

这里是学生程序员。我无法从 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);
}

在写入二进制文件并访问读取函数后,房间号(int值)读取正常,但两个字符串(名称和IC号码)读出为垃圾字符。随后,关闭并重新启动程序,然后尝试从文件中读取将给我一个访问冲突和错误的指针错误。

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

【问题讨论】:

    标签: c file binary access-violation


    【解决方案1】:

    您正在写入指向文件的指针,而不是实际数据。当您从文件中读取指针时,它只是一个您可能无权访问的内存地址,即使您在写入文件的同一进程中执行此操作(因为它实际上是指向函数范围堆栈的指针变量)。

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

    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* 会将内容写入文件中。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-02-18
      • 2014-12-23
      • 2018-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-18
      相关资源
      最近更新 更多