【问题标题】:I try to edit .dat file but it does not work我尝试编辑 .dat 文件,但它不起作用
【发布时间】:2020-09-07 02:10:12
【问题描述】:

我尝试在 C 中编辑一个文件,但它不起作用。如果文件不存在,则代码会创建该文件,但无法对其进行编辑。我试图更改文件打开状态,但没有。这是代码:

typedef struct{
    char name[MAXSTRING];
    int id;
  }student;


int main(int argc, const char **argv){

        i = 0;
        FILE *fp;
        if ( (fp=fopen("StudentsFile.dat", "w") ) == NULL ){
            printf("FILE CAN NOT OPEN");
        }else{
             printf("INSERT NAME AND ID OF THE STUDENT\n");
            student *stArray = (student *) malloc(sizeof(student));
            scanf("%s" "%d", &stArray->name, &stArray->id);
            while (!feof(stdin))
            {

                fprintf( fp ,"%s", stArray->name );
                scanf("%s" "%d", &stArray->name, &stArray->id);
                printf("%s ", &stArray->name);

            }
            fclose (fp);
         }
             return 0;

     }

【问题讨论】:

  • 你怎么知道不能编辑?
  • 注意 "%s" "%d" 将被合并到 "%s%d"', so the string argument will consume the integer argument. You want it to be "%s %d"`。编辑:不,输入中的空间应该解决这个问题。
  • 另外,你是怎么调用程序的?如果您以交互方式运行它,则必须以Ctrl+d 结束它以关闭stdin 并让它退出循环。如果您以交互方式运行并以Ctrl+c 结束,它将退出而不调用fclose,因此它不会刷新缓冲区并且您将看不到写入。
  • 我从大学的书中复制了代码,并且 fclose 不在循环中。这就是为什么我没有把它放进去。我按照你的指示做了,它起作用了。谢谢!!!
  • 跳出循环是正确的,但需要确保循环运行后的代码,即不会突然退出。

标签: c file


【解决方案1】:

这句话似乎被怀疑了:

scanf("%s" "%d", &stArray->name, &stArray->id);

应该是:

scanf("%s %d", &stArray->name, &stArray->id);

无论如何,您似乎正在尝试将数据追加StudentsFile.dat。如果您使用w 模式,它只会写入但不会追加。这种情况需要使用"a"模式。

因此,您应该创建另一个文件指针,如下所示:

FILE *fp2 = fopen("StudentsFile.dat", "a")

在这种情况下,使用fprintf() 代替fp2 而不是fp1

在 while 循环中,您不需要任何 scanf(),因为您正在尝试将数据附加到文件中。

注意:您在fprintf() 语句中缺少%d for stArray->id,不要忘记在fp 之后关闭fp2

这是append text into a file的清除方法

【讨论】:

    猜你喜欢
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    相关资源
    最近更新 更多