След известно мислене по задачата реших да потърся помощ. Част от задачата съм тествал. Друга част не успях поради ограничените ми знания. Задачата е:
Да се състави програма ©, организирана като меню, която чете текстов файл, записва резултатите във файл (потребителят трябва да въведе имената на двата файла) и има следните възможности:
• Определяне на най-често срещаният във файла символ
• Определяне на най-често срещаната дума
• Определяне броя на символите във файла
• Определяне на най-дългият и най-късият ред във файла
Възможностите на програмата да се реализират чрез отделни функции. Четенето от файла да става по редове.
Все още съм начинаещ. Притесняват ме главно първите 2 функции. Switch-a от менюто ще има допълнителна обработка, зададените стойности са за проба на програмата. Написал съм част от нея(менюто с проверките и едната функция):
#include <stdio.h>
#include <ctype.h>
FILE *fp;
FILE *fp2;
int commSymb(FILE *fp, char *filename); //функция, определяща най-често срещания символ във файла
int commWord(FILE *fp, char *filename); // функция, определяща най-често срещаната дума във файла
int sum(FILE *fp, char *filename); //функция, определяща броя на символите във файла
int longshort(FILE *fp, char *filename); //функция, определяща най-дългия и най-късия ред във файла
main()
{
char option;
char filename[28]; //съдържа името на първия файл
char filename2[28]; //съдържа името на втория файл
printf("Enter the name of the file (read from): ");
gets(filename);
printf("Enter the name of the file (save to): ");
gets(filename2);
fp=fopen(filename, "r");
if ((fp=fopen(filename,"r"))==NULL) //проверка дали първият файл съществува
{
printf("\n\n*** The file does not exist *** \n");
exit(1); //излиза от програмата
}
fp2=fopen(filename2,"w");
if ((fp2=fopen(filename2,"w"))==NULL) //проверка дали вторият файл същестува
{
printf("\n\n*** The file does not exist *** \n");
exit(1); //излиза от програмата
}
do
{
printf("Enter the number of the function and press Enter.\n\n");
printf("\t1. Most common symbol. \n");
printf("\t2. Most common word.\n");
printf("\t3. Number of all symbols.\n");
printf("\t4.Longest and shortest line. \n");
option=getche();
}
while ((option!=49) && (option!=50) && (option !=51) && (option !=52)); // проверка за коректно въвеждане на номерата на функциите
switch(option) // избор на функция, спрямо въведената стойност
{
case (49):
case (50): printf("option 2"); break;
case (51): {
FILE *fp;
FILE *fp2;
int s;
s=sum(fp,filename);
fp2=fopen(filename2,"w");
fp2=fputs(s,filename2);
break;
}
case (52): printf("option 4"); break;
}
return 0;
}
int sum(FILE *fp, char *filename) //определя броя на символите във файла
{
int s=0;
fp=fopen(filename, "r");
char ch;
if(fp==NULL) //проверка
{
printf("The file cannot be opened! \n");
exit(1);
}
while((ch=fgetc(fp))!=EOF) //четене от файла
s++;
fclose(fp);
return(s);
}
Работил съм и по последната функция, но поради ограничените ми знания съм 100% сигурен, че има грешка. Проблемът е, че не знам как точно да обходя файла по редове(aко може да ми обясните по-подробно). С прочетеното за fseek разбрах, че с текущите параметри не би трябвало да има отместване спрямо позицията, до която съм стигнал. Но не съм сигурен как точно да използвам fseek(Моля не се смейте, все пак реших да опитам ):
int longshort (FILE *fp, char *filename)
{
char c,s,y;
int longest,shortest,count,cn,t;
longest=0;
shortest=0;
count=0;
cn=0;
fp=fopen(filename,"r");
if(fp==NULL)
{
printf("The file cannot be opened! \n");
exit(1);
}
while((s=fgetc(fp))!='\n')
count++;
shortest=count;
do
{
fseek(fp,0L,SEEKCUR);
do
{
cn++;
cn=longest;
if (shortest > longest)
{
shortest=t;
shortest=longest;
longest=t;
}
}
while((y=fgetc(fp))!=/n);
}
while((c=fgetc(fp))!=EOF);
fclose(fp);
return(shortest);
return(longest);
}