#include <stdio.h>
#include "SqList.h" // 线性表的存储与操作
int pickword ( FILE *f, char *fword );
int main()
{
FILE *f1, *f2;
const int MAX_FILENAME = 20;
char fname1[MAX_FILENAME] = "TUT.txt";
char fname2[MAX_FILENAME] = "result.txt";
printf ( "请指定源文件名(不超过%d个字符):", MAX_FILENAME );
scanf ( "%s", fname1 );
printf ( "请指定要输出结果的文件名(不超过%d个字符):", MAX_FILENAME );
scanf ( "%s", fname2 );
if ( ( f1 = fopen ( fname1, "r" ) ) == NULL )
{
printf ( "打开文件%s失败!\n", fname1 );
return 0;
}
else
printf ( "打开文件%s成功!\n", fname1 );
SqList L;
SqListInit ( &L );
char fword[MAX_CHARACTER];
fword[MAX_CHARACTER - 1] = '\0';
int i = -1;
while ( !feof ( f1 ) )
{
int judge = pickword ( f1, fword );
if ( -1 == judge )
{
printf ( "存在单词字符长度超过数组界限\n" );
return -1;
}
if ( SqListBSearch ( &L, fword, i ) )
{
L.elem[i].count++;
}
else
{
SqListInsert ( &L, i, fword );
}
}
if ( ( f2 = fopen ( fname2, "w" ) ) == NULL )
{
printf ( "写入文件%s失败!\n", fname2 );
return 0;
}
else
printf ( "文件已写入%s!\n", fname2 );
SqListPrint ( f2, fname1, &L );
fclose ( f1 );
fclose ( f2 );
}
int pickword ( FILE *f, char *fword )
{
char ch;
for ( int j = 0 , flag = 0 ; !feof ( f ) ; )
{
if ( j >= MAX_CHARACTER )
{
return -1;
}
ch = fgetc ( f );
if ( ch >= 'A' && ch <= 'Z' )
{
fword[j++] = ch + 32;
flag = 1;
}
if ( ( ch >= 'a' && ch <= 'z' ) )
{
fword[j++] = ch;
flag = 1;
}
if ( '-' == ch && fword[j - 1] >= 'a' && fword[j - 1] <= 'z' )
{
fword[j++] = ch;
}
if ( ! ( ( ch >= 'A' && ch <= 'Z' ) || ( ch >= 'a' && ch <= 'z' ) || '-' == ch )
&& flag == 1 )
{
if ( fword[j - 1] == '-' )
fword[j - 1] = '\0';
fword[j] = '\0';
return 0;
}
}
}