首页 新闻 会员 周边

C语言文件内容和文件指针不同步,是怎么回事

0
悬赏园豆:5 [已关闭问题] 关闭于 2021-01-28 21:37

用C写了一个统计文件行数和单词数的程序,但是发现运行结果的字母明显偏高于文件中的字数,起初觉得是逻辑问题,然后开始断点调试,惊讶的发现文件指针指向的字符内容(即_base)和文件上的内容完全不一致,图中的这个文件data2.txt之前有用于一个留言板C程序的文件存储,而base里面的内容是我上次在留言板程序中用fprintf写进去的内容,奇怪的是,data2.txt为什么没有实时把写入的内容全部更新到文件上,但是在文件指针上却能看到?

image-20210128194810440

把data2.txt上的内容全部删掉,发现文件指针依然指向之前的字符,看来文件指针遍历的文字跟文件内容无关?

image-20210128195015609

猜想用留言板程序msgboard.c再去操作文件应该会刷新指针,但是使用msgboard.c写入了一些字符后,再去debug有问题的linecounter.c,发现文件指针fp内容依旧,跟函数读写也无关?那fp的内容要怎么重置?

image-20210128195919258

程序如下。

//功能:统计文件的行数,字符数,单词数,并逐行打印文件
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define MAX_SIZE 100
void counter(char*);
int main()
{
    char fileName[MAX_SIZE];
    printf("输入文件名:\n");
    gets(fileName);
    counter(fileName);

}
void counter(char* str)
{
    int line,word,charNum;
    char fileName[MAX_SIZE];
    char c;
    strcpy(fileName,str);

    FILE* fp = fopen(fileName,"r");
    if(fp == NULL)
    {
        printf("无此文件!\n");
        return main();
    }
    printf("%s 打开成功!\n",fileName);

    printf("行数  |字符数  |单词数  |\n");
    while((c = fgetc(fp)) != EOF)
    {
        charNum++;
        if(c == '\n')
        {
            line++;
        }   
        if(!(c >'a'&& c < 'z' ) && !(c >'A'&& c < 'Z' ))  //单词看作字母的组合,如果获取的字符不在a-z或A-Z内说明已到单词末尾
        {
            word++;
        }
    }
    printf(" %d      %d      %d\n",line,charNum,word);  
    fclose(fp);
}C

另:又换了菜鸟教程上C文件读写教程的一个file.txt做测试,显示"This is C programming",而这是程序在该文件写入的第一个文本,而后面文件内容修改了以后,fp的_base属性显示的仍然是“This is C programming”,说明fp似乎固定指向第一次写入空文件的文本。

C
另一种开始的主页 另一种开始 | 初学一级 | 园豆:119
提问于:2021-01-28 20:01
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册