资源简介

对读入的某个文本文件input.txt中,拆出英文单词,输出一个按字典顺序排列的单词表,结果输出在文本文件output.txt中,每个单词一行,并在单词后输出该单词出现的个数,两个字段之间用逗号分隔。约定单词仅由英文字母组成,单词间由非英文字母分隔,相同单词只输出一个,大小写不区分。

资源截图

代码片段和文件信息

/*
 * Copyright(C) 2011 Ruijie Network. All rights reserved.
 */
/*
 * file_operate.c
 * Original Author:  hgt@ruijie.com.cn 2011-3-3
 *
 * 与文件相关的操作函数模块。该模块中包含了文件打开,求文件
 * 长度,输入字符串到文件,从文件中读取单词的操作。并且,
 * 这些操作都是安全的。
 *
 * History
 *
 */
#include “file_operate.h“

/**
 * 安全的打开文件
 * @fname: 文件名
 * @attr: 文件打开时的属性值
 *
 * 以指定的方式打开给定的名称的文件。当文件不存在时,该函数会用给
 * 定的名称以读写方式创建文件,并返回文件指针。
 */
FILE* file_open( char* fname char* attr ){

    FILE* fp;

    fp = NULL;
    fp = fopen( fname attr );
    if ( fp == NULL ) { /*打开文件失败*/
        printf(“Arguments error !\n“);
        printf(“System will create  file.\n“);
        fp = fopen( fname “w+“ ); /*新建文件*/
        if ( fp == NULL ) {
            printf(“System error!\n“);
            exit( -1 );
        }
    }
    return fp;
}

/**
 * 获得指定文件的长度
 * @fp: 文件指针
 *
 * 获得文件的长度,并返回。
 */
long file_lenght( FILE* fp ){

    long length;
    long locate;

    if ( fp == NULL) {
        printf(“Arguments error !\n“);
        return -1;
    }

    locate = ftell( fp );           /*获得文件指针的当前位置*/
    fseek( fp 0L SEEK_END );      /*将文件指针指向文件尾部*/
    length = ftell( fp );           /*获得文件的长度*/
    fseek( fp locate SEEK_SET );  /*恢复文件指针的位置*/

    return length;
}

/**
 * 输入任意字符到指定的文件
 * @fp:文件指针
 *
 * 从标准输入中获取字符,送到fp所指向的文件中
 * 按‘#’键结束输入
 */
void input2file( FILE* fp ){

    char ch;

    if ( fp == NULL ) {
        printf(“Arguments error!\n“);
        return;
    }

    printf(“Enter # to stop input.\n“);
    while ( (ch = getchar()) != ‘#‘ ) {
        fputc( ch fp );
    }
    fseek( fp 0L SEEK_SET );      /*将文件指针重新指向文件头*/
    return;

}


#define BUFFER_LEN 512 /*单词缓冲区增量*/

/**
 * 从给定的文件中读取单词
 * @fp:文件指针
 *
 * 从指定的文件中读取单词,并返回。需要注意的是,
 * 返回单词时,是以堆内存为载体的,所以需要在其他
 * 地方释放,否则会造成内存泄露。
 */
char* read_word( FILE* fp ){

    char ch;
    char* word;
    int   buflen;
    int   wordlen;

    MALLOC( word char BUFFER_LEN );                               /*申请单词缓冲区*/
    buflen = BUFFER_LEN;
    wordlen = 0;

    while ( !feof( fp ) ) {
        ch = fgetc( fp );
        if ( ch >= ‘a‘&& ch <= ‘z‘ || ch >= ‘A‘&& ch <= ‘Z‘ ) {     /*判断是否是单词的组成元素*/
            if ( wordlen >= buflen ) {                              /*如果单词的长度大于缓冲区的大小,则需要扩大缓冲区大小*/
                REALLOC( word char ( buflen + BUFFER_LEN ) );     
                buflen += BUFFER_LEN;
            }
            word[wordlen++] = ch;
        } else if ( wordlen > 0) {                                  /*拼装成功一个单词,并返回*/
            word[wordlen] = ‘\0‘;
            return word;
        } else{                                                     /*未遇到有效字符*/
            continue;
        }
    }

    if ( wordlen > 0 ) {
        word[wordlen] = ‘\0‘;
        return word;
    } else {
        free( word );
        return (char*)0;
    }
}


 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       3333  2011-03-05 12:02  hgt编码练习\file_operate.c

     文件        441  2011-03-05 12:21  hgt编码练习\file_operate.h

     文件       1323  2011-03-05 12:21  hgt编码练习\main.c

     文件        258  2011-03-05 05:11  hgt编码练习\makefile

     文件        592  2011-03-05 12:05  hgt编码练习\memory.c

     文件        931  2011-03-05 12:21  hgt编码练习\memory.h

     文件       5122  2011-03-05 12:21  hgt编码练习\word_operate.c

     文件        505  2011-03-05 11:25  hgt编码练习\word_operate.h

     目录          0  2011-03-05 12:21  hgt编码练习

----------- ---------  ---------- -----  ----

                12505                    9


评论

共有 条评论