feof函数,fscanf函数,strtok函数等遇到的小疑惑解决办法

来源:互联网 发布:网页朗读软件 编辑:程序博客网 时间:2024/04/30 05:15

feof函数,fscanf函数,strtok函数等遇到的小疑惑解决办法

      近几天我等几个小菜鸟要做一个快译通软件,简单实现根据英语查汉语,本人负责将dict.txt词库中的单词调入内存哈希表。现把自己在敲代码中遇到的几个问题及解决办法记录下来。
    1.feof()函数用于判断是否读写到文件尾,会多执行一次的解决办法。
     EOF是文本文件结束的标志。在文本文件中,数据是以字符的ASCⅡ代码值的形式存放,普通字符的ASCⅡ代码的范围是32到127(十进制),EOF的十进制为26,因此可以用EOF作为文件结束标志。
    当把数据以二进制形式存放到文件中时,就会有-1值的出现,因此不能采用EOF作为二进制文件的结束标志。为解决这一个问题,ASCI C提供一个feof函数,用来判断文件是否结束。feof函数既可用以判断二进制文件又可用以判断文本文件。
    feof()函数判断文件是否结束,结束或者出错返回非零值,否则返回零。
    C语言的“feof()”函数和数据库中“eof()”函数的运作是完全不同的。数据库中“eof()”函数读取当前指针的位置,C语言的“feof()”函数返回的是最后一次“读操作的内容”。举个简单的例子,比如有人说“你走到火车的最后一节车厢”这就是位置。而如果说“一直向后走,摸到铁轨结束”这就是内容。也就是说用内容来判断会“多走一节”。这就是完全依赖于“while(!feof(FP)){...}”进行文件复制时,目标文档总会比源文档“多出一些”的原因。
    解决办法:
    
while(1)  .... if(feof(fp)) break;

    2.fscanf()函数从文件中读取文本,遇到空格结束的解决办法。
    char str[100];
    fscanf(fp,"%[^\n]%*c",str);
    正则表达式的运用,[]读取数据但只允许读取括号内的字符,[^]读取数据但不允许括号内的字符出现,上两行代码就是读到换行符才结束,%*c任意个字符。
    3.函数调用导致对同一文件fclose()两次的错误。
    我在主函数及调用函数中都添加了fclose(fp),运行提示对同一地址重复释放内存的错误。
    4.while(1)的使用与#if 0 #endif的使用。
    while(1)
    {
        跳出死循环的语句,如
        if(i>25)
            break;
    }
    #if 0
    #endif
    实现注释掉一块代码;
    5.全局变量的运用。
    静态全局变量只在所定义的源文件中起作用,非静态全局变量在整个源程序中起作用。
    6.以"wb"方式打开fopen()文件,fwrite()文件是不是二进制,可不可以查看的问题。
    如果你写入的是字符串,虽然你是以二进制方式写入的,但文本编辑器还是会去一个字节一个字节地解释文件,所以结果还是文本。但如果是int型数据,你用cat查看就是乱码,因为int型数据占四个字节。所以并不是所有的二进制文件都不能用cat命令查看。
    7.strtok函数的使用。
    一个以前的源代码:
   
#include <stdio.h>#include <string.h>int main(void){FILE *fp;char buf[256];char *p;char *token;char *a[7];fp=fopen("/etc/passwd","r");if(fp==NULL){perror("open:");return 1;}while((p=fgets(buf,256,fp))!=NULL){int i=0;token=strtok(p,":");printf("%s:",token);while((token=strtok(NULL,":"))!=NULL){a[i++]=token;}printf("%s\n",a[4]);}fclose(fp);return 0;}
 8.如果你想从标准输入中写一个带空格的字符串到字符数组中
   例如:
   char str[50];
   printf("please input:\n");
   getchar();
   fgets(str,50,stdin) ;
   我想说的getchar()的用法!
  详细源代码等项目完成再上传。
原创粉丝点击