【问题标题】:Updating Record in C LanguageC语言更新记录
【发布时间】:2015-03-04 20:16:46
【问题描述】:

有人可以帮我处理这段代码吗?当我尝试此代码时,它根本不起作用。我在使用 C 语言处理文件方面的经验非常少。请帮我解决这个问题

这是结构

struct passenger
{
    char airline[20];
    char name[20];
    int age;
    char gender;
    char clas[10];
    int seatNo;

}e;

这里是插入记录的函数

oid reserve()
{
    int airline, clas;
    printf("\nSelect your flight:");
    printf("\n1. PIA\n2. Shaheen\n3. Air Blue\n\nEnter Choice:");
    scanf("%d", &airline);
    if (airline == 1)
        strcpy(e.airline, "\nPIA");
    else if (airline == 2)
        strcpy(e.airline, "\nShaheen");
    else if (airline == 3)
        strcpy(e.airline, "\nAirBlue");

    printf("\nEnter Name:");
    scanf("%s", &e.name);

    printf("\nEnter Age:");
    scanf("%d", &e.age);

    printf("\nEnter Your Gender (M/F): ");
    e.gender = getche();

    printf("\n\nPress 1 for ECONOMY CLASS and 2 for BUSSINESS CLASS: ");
    scanf("%d", &clas);
    if (clas == 1)
        strcpy(e.clas, "Economy");
    else
        strcpy(e.clas, "Bussiness");
    e.seatNo = rand() % 500;
    printf("\nYour seat num is: %d\n\n", e.seatNo);

    if (airline==1)
        save = fopen("PIA.DAT", "a");
    else if (airline==2)
        save = fopen("Shaheen.DAT", "a");
    else
        save = fopen("AirBlue.DAT", "a");
    fwrite(&e, sizeof( struct passenger), 1, save);
    fclose(save);

    getch();
}

这是为了更新记录

void update()
    int  i = 1, count = 0, clas, record = 0;
    int seat, airline;
    struct passenger se;
    printf("\n\n\nSelect your flight:");
    printf("\n1. PIA\n2. Shaheen\n3. Air Blue\n\nEnter Choice:");
    scanf("%d", &airline);

    if (airline == 1)
        updateR = fopen("PIA.DAT", "r+");
    else if (airline == 2)
        updateR = fopen("Shaheen.DAT", "r+");
    else
        updateR = fopen("AirBlue.DAT", "r+");

    if (updateR == NULL)
    {
        printf("File not found.");
    }
    else
    {
        printf("\nEnter Your Seat No: ");
        scanf("%d", &seat);
        while (!feof(updateR))
        {
            fread(&se, sizeof(struct passenger), 1, updateR);
            if (se.seatNo == seat)
            {
                printf("\nEnter Name:");
                scanf("%s", &e.name);

                printf("\nEnter Age:");
                scanf("%d", &e.age);

                printf("\nEnter Your Gender (M/F): ");
                e.gender = getche();

                printf("\n\nPress 1 for ECONOMY CLASS and 2 for BUSSINESS CLASS: ");
                scanf("%d", &clas);
                if (clas == 1)
                    strcpy(e.clas, "Economy");
                else
                    strcpy(e.clas, "Bussiness");
                fseek(updateR,sizeof(struct passenger)* record, SEEK_END);
                fwrite(&e, sizeof(&e), 1, updateR);
                break;
            }
        }
        fclose(updateR);
    }
    getch();
}

【问题讨论】:

  • 请提供更多信息。代码应该做什么?你期望什么输出?你实际上得到了什么输出(如果有的话)?这种上下文可以帮助读者帮助你。
  • 我不确定这两行 fread(&se, sizeof(struct Passenger), 1, updateR); if (se.seatNo == seat) 看起来您假设您的 fread 会自动将行信息放入结构的正确字段 (se.seatNo)。我会先调查一下,以检查它是否正常工作。
  • @AmmarBukhari:您应该edit您的问题以改进它,而不是在评论部分提供其他信息。
  • sizeof(&e) -> sizeof(struct e) 假设您正在尝试获取结构的大小
  • 我很好奇你为什么将这个变量称为clas 而不是class。是不是您正在使用 C++ 编译器编译您的 C 代码(它将 class 视为关键字)?如果你愿意,你可以这样做,但如果你用 C 编程,你真的应该使用 C 编译器。

标签: c file updates


【解决方案1】:

缺少一些信息,无法进行全面分析。但乍一看,您是从文件末尾寻找的。您正在使用 SEEK_END。通常你应该使用 SEEK_SET。

【讨论】:

  • @AmmarBukhari:SEEK_END 绝对是错误的。您正试图越过文件末尾。可能fseek() 失败了,但是(这非常重要)你没有检查它是成功还是失败。阅读fseek 的文档,了解如何确定并进行测试。
【解决方案2】:

scanf 扫描字符串时不需要地址运算符。

那么你在哪里:

scanf("%s", &e.name);

你真的应该有:

scanf("%s", e.name);

【讨论】:

  • @AmmarBukhari:是的,可能会——但& 仍然不正确。 scanf"%s" 需要 char* 类型的参数,这是隐式数组到指针转换后的 e.name 类型。 &e.name 也是一个指针值,指向同一个内存位置,但它的类型是 char (*)[20](指向 20 个 chars 的数组的指针)。严格来说,scanf("%s", &e.name); 具有未定义的行为。一些编译器可能会就此发出警告。 abelenky:这不能回答 OP 的问题;这是一个有效的观点,但这不是问题的原因。这将是一个很好的评论。
  • @KeithThompson:由于 OP 的“问题”基本上是,“当我尝试这段代码时它根本不起作用。”,谁说这不是问题??我认为他没有提供足够的信息让我们知道我们应该解决什么问题。
  • @abelenky:我建议不够了解,无法发布答案。考虑到几乎所有 C 编译器都实现了指针和可变参数函数的方式,删除 & 几乎肯定不会解决问题。
【解决方案3】:

您正在打开一个文本文件,并写入一个结构 * 的内容,这可能无法按照您的预期工作。我不知道你的文件格式是什么,你没有指定它。 假设一个逗号分隔的变量格式文件,每行一条记录。它可能看起来像这样:

Alaska, Jones, 23, 1, First, 12
NW, Smith, 12, 1, No, 34
...  

然后,从该文件写入和读取的代码可能如下所示:

typedef struct passenger
{
    char airline[20];
    char name[20];
    int age;
    char gender[2];//note re-definition from your original
    char clas[10];
    int seatNo;

}E;

void UpdateRecord(char *path, char *record);
void ReadRecord(char *path, E *db, int record);
int getLines(char *path);

int main(void)
{
    FILE *fp = {0};
    char line[80] = {"Alaska2, Jones2, 23, M, First, 12\n"};
    E e;

    UpdateRecord(".\\new.dat", line);
    ReadRecord(".\\new.dat", &e, 1); //Get first line
    ReadRecord(".\\new.dat", &e, getLines(".\\new.dat")); //Get last line

    return 0;
}
void UpdateRecord(char *path, char *record)
{
    FILE *fp = fopen(path, "a");
    if(fp)
    {
        fputs(record, fp);
    }
    fclose(fp);
}

void ReadRecord(char *path, E *db, int record)
{
    int i = 0;
    FILE *fp = fopen(path, "r");
    char line[80];
    char *buf = {0};
    while(fgets(line, 80, fp))
    {
        if(++i == record)
        {
            //get e.airline
            buf = strtok(line, " ,\n");
            if(buf) strcpy(db->airline, buf);
            //get e.name
            buf = strtok(NULL, " ,\n");
            if(buf) strcpy(db->name, buf);
            //get e.age
            buf = strtok(NULL, " ,\n");
            if(buf) db->age = atoi(buf);
            //get e.gender
            buf = strtok(NULL, " ,\n");
            if(buf) strcpy(db->gender, buf);
            //get e.clas
            buf = strtok(NULL, " ,\n");
            if(buf) strcpy(db->clas, buf);
            //get e.seatNo
            buf = strtok(NULL, " ,\n");
            if(buf) db->seatNo = atoi(buf); 
        }
    }
    fclose(fp);
}

int getLines(char *path)
{
    int lines = 0;
    char line[80];
    FILE *fp = fopen(path, "r");
    if(fp)
    {
        while(fgets(line, 80, fp))
        {
            lines++;
        }
        fclose(fp);
    }
    return lines;
}

【讨论】:

  • 谢谢.. 问题在于打开和写入二进制文件。我尝试使用“wb”和“rb”文件模式,我的代码开始工作。再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
相关资源
最近更新 更多