用C写了一个统计文件行数和单词数的程序,但是发现运行结果的字母明显偏高于文件中的字数,起初觉得是逻辑问题,然后开始断点调试,惊讶的发现文件指针指向的字符内容(即_base)和文件上的内容完全不一致,图中的这个文件data2.txt之前有用于一个留言板C程序的文件存储,而base里面的内容是我上次在留言板程序中用fprintf写进去的内容,奇怪的是,data2.txt为什么没有实时把写入的内容全部更新到文件上,但是在文件指针上却能看到?
把data2.txt上的内容全部删掉,发现文件指针依然指向之前的字符,看来文件指针遍历的文字跟文件内容无关?
猜想用留言板程序msgboard.c再去操作文件应该会刷新指针,但是使用msgboard.c写入了一些字符后,再去debug有问题的linecounter.c,发现文件指针fp内容依旧,跟函数读写也无关?那fp的内容要怎么重置?
程序如下。
//功能:统计文件的行数,字符数,单词数,并逐行打印文件
#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似乎固定指向第一次写入空文件的文本。