c语言中读/写文本文件的混淆

c语言中读/写文本文件的混淆,c,C,我正在尝试在.txt文件中执行一些简单的读/写操作。我编写了一个函数用于读取内容,另一个函数用于写回内容-1 例如,“counter.txt”中的内容是20。完成我的代码后,我认为控制台输出应该如下所示: 现在的指数是:20 现在的指数是:19 但这显示了20和0,我不明白为什么。谢谢你的帮助 #include <stdio.h> #include <stdlib.h> int read_data() { FILE *fptr; char *s;

我正在尝试在.txt文件中执行一些简单的读/写操作。我编写了一个函数用于读取内容,另一个函数用于写回内容-1

例如,“counter.txt”中的内容是20。完成我的代码后,我认为控制台输出应该如下所示:

现在的指数是:20

现在的指数是:19

但这显示了20和0,我不明白为什么。谢谢你的帮助

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

int read_data() {
    FILE *fptr;
    char *s;
    fptr = fopen("counter.txt","r");
    if (!fptr) {
        printf("fail to open..\n");
        exit(1);
    }

    fgets(s,25,fptr);
    fclose(fptr);

    return atoi(s);
}

void write_data(char *s) {
    FILE *fptr;
    fptr = fopen("counter.txt","w");
    if (!fptr) {
        printf("fail to open..\n");
        exit(1);
    }

    fputs(s,fptr);
    fclose(fptr);
}

int main(void) {
    char index_str[5];
    int index = read_data();
    printf("index now is:%d\n", index);
    sprintf(index_str,"%d",index-1);
    write_data(index_str);

    index = read_data();
    printf("index now is:%d\n", index);
    sprintf(index_str,"%d",index-1);
    write_data(index_str);
    return 0;
}
#包括
#包括
int read_data(){
文件*fptr;
char*s;
fptr=fopen(“counter.txt”,“r”);
如果(!fptr){
printf(“无法打开..\n”);
出口(1);
}
fgets(s,25,fptr);
fclose(fptr);
返回atoi(s);
}
无效写入数据(字符*s){
文件*fptr;
fptr=fopen(“counter.txt”,“w”);
如果(!fptr){
printf(“无法打开..\n”);
出口(1);
}
FPUT(s、fptr);
fclose(fptr);
}
内部主(空){
字符索引_str[5];
int index=read_data();
printf(“现在的索引是:%d\n”,索引);
sprintf(索引为%d,索引为-1);
写入数据(索引);
索引=读取数据();
printf(“现在的索引是:%d\n”,索引);
sprintf(索引为%d,索引为-1);
写入数据(索引);
返回0;
}
读取数据()
中,更换

char *s;


您将拥有一个有效的
s
。这将在堆栈上分配200个字节,您(
fgets()
)可以安全地在那里写入内容并使用它。

查找读取的数据()。fgets()读取的最多25个字符的存储在哪里?s是指针。它指向什么?在read_data中,char*s指向任何地方或什么都没有。在第一次read_data()之后,s指向字符串的结尾。@KennyYang:不,你在
read_data
中的
s
指针从未设置为指向任何东西。这就是C标准所谓的“未定义的行为”,任何事情都可能发生。嗯,不,你这么认为吗
s
指向“nothing”-它没有定义的值。我认为char s[25]更合适,因为它将匹配他所拥有的fgets(,25,)。此外,肯尼扬可以考虑定义一些类似于定义的BuffelyLLN 25,在S[]声明以及FFET(…)中使用BuffelyLin。定义是最好的方法。。。fgets(s,sizeof s,fptr)甚至更好。嗯!chux,这也是一个非常好的解决方案!
char s[200];