【问题标题】:Editing structures with pointers使用指针编辑结构
【发布时间】:2022-12-20 09:56:36
【问题描述】:

我正在上编程课,就像几年前一样,我有点迷茫和迷茫。

我正在尝试创建结构并将其保存到文件中/从文件中保存结构,然后选择一个特定的文件并对其进行编辑。

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

struct studentdata{
int student_number;
char student_name[40];
int student_id;
char student_address\[60];
int phone_number;
};

void main(){
FILE *p;
struct studentdata insert;
int edit_student;
int location;
struct studentdata change;
struct studentdata *edit;
edit = &change;

p = fopen("students.txt","a");

printf("Insert student\n\n ");
    printf("Student Number: ");
    scanf("%d", &insert.student_number);
    printf("Student Name: ");
    scanf("%s", &insert.student_name);
    printf("Student ID: ");
    scanf("%d", &insert.student_id);
    printf("Address: ");
    scanf("%s", &insert.student_address);
    printf("Phone Number: ");
    scanf("%d", &insert.phone_number);
    printf("\tData saved sucessfully.\n");

        fwrite(&insert, sizeof(struct studentdata), 1, p);
        fclose(p);


        p = fopen("students.txt","r+");

        while(fread(&change,sizeof(struct studentdata),1,p)){
        printf("Student Number: %d\n", change.student_number);
        printf("Student Name: %s\n", change.student_name);
        printf("Student ID: %d\n", change.student_id);
        printf("Address: %s\n", change.student_address);
        printf("Phone Number: %d\n", change.phone_number);
        if (feof(p))
                break;
        }

        printf("Please input the student number you want to edit:");
        scanf("%d",&edit_student);
        fseek(p, 0, SEEK_SET);
        system("cls");


        while(fread(&change,sizeof(struct studentdata),1,p)){

        if ( change.student_number == (edit_student) ){

                    location = ftell(p);

                setbuf(stdin, NULL);
                    printf("Current student name: %s\n", change.student_name);
                    printf("\New student name: ");
                    scanf("%s", &edit->student_name);
                    printf("Current Student ID: %d\n", change.student_id);
                    printf("\tNew Student ID: ");
                    scanf("%d", &edit->student_id);
                    printf(" Current Address: %s\n", change.student_address);
                    printf("\tAddress / CP: ");
                    scanf("%s", &edit->student_address);
                    printf("Current Phone Number: %d\n", change.phone_number);
                    printf("\tPhone Number: ");
                    scanf("%d", &edit->phone_number);

                        location = ftell(p);

                    fwrite(&edit,sizeof(struct studentdata),1,p);
                    fclose(p);
                    break;
        }
            if (feof(p))
                break;
        }
}

但是考虑到我花了多少时间围绕这个想法进行大量测试并且没有去任何地方,我什至怀疑我是否在使用正确的逻辑

我已经测试了很多我在互联网上找到的建议,但很可能,我总是遗漏了一些东西,或者类似的东西

我试过使用指针,因为这是应该用于做这类事情的选项,但数据一直保存在文件的末尾,而不是覆盖我试图放置新文件的内存位置数据

由于一些奇怪的原因,即使我现在可以看到我在文件中保存了 2 个以上的用户(当运行第一个输入收集用户数据时),fread 只打印 2

这很奇怪,因为我在运行测试的其他文件中使用了相同的参数,并且它们打印了所有文件数据

又一个项目,其中的东西没有按应有的方式工作……

我的问题是,例如,如果我在文件中保存了 4 个结构,并且我选择了第二个进行编辑(并且我已经验证 ftell 告诉我它位于属于第二个结构的内存位置) 当我编辑它的数据并运行 fwrite 时,它​​不应该将结构数据保存在当时的位置,从而覆盖它吗?

【问题讨论】:

  • edit 是指向struct studentdata 的指针。它包含结构的地址。如果你想写那个结构,你会使用fwrite(edit, ...而不是fwrite(&amp;edit, ...
  • 根据之前的评论,回顾 fwrite(&edit, 1, sizeof(struct studentdata),p);见tutorialspoint.com/c_standard_library/c_function_fwrite.htm
  • 如果没有适当的序列化/反序列化,您不能将结构直接读/写到文件中。否则文件将完全不可移植,并且充满填充字节形式的垃圾数据。

标签: c pointers struct


【解决方案1】:

该代码还有很多需要改进的地方,但请直接回答您的问题:

while(fread(&change,sizeof(struct studentdata),1,p))

在那条线上,你正在阅读一个完整的学生。此操作将文件索引移动到您刚刚阅读的学生之后的位置。然后将更新后的学生写入该位置的文件(就在您刚刚阅读的学生之后,这就是您要修改的学生)。
您需要在写入之前将文件中的索引移回原位(使用 fseek 和您在新学生阅读之前从ftell 获得的位置)。 您需要将 fread 调用移至 while 循环内。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 2017-04-02
    • 1970-01-01
    • 2020-09-12
    • 2011-02-01
    相关资源
    最近更新 更多