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