mikeregas
asked on
using fgets to read one line at a time
I have a program that is intended to be a spell checker and I am trying to get it to read one line at time so that the output for the program is correct. It does read the file properly and return the misspelled words, however they are all on line 1. I need it to read into the paragraph and return the different lines and I have no idea how to do that.
Here is a sample output for the file
The following words were not recognized:
Line 5 - compter
Line 8 - sciance
Line 23 - oone
the code for the program is attached
Here is a sample output for the file
The following words were not recognized:
Line 5 - compter
Line 8 - sciance
Line 23 - oone
the code for the program is attached
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//CONSTANTS
#define wrdlen 48
#define linelen 1024
// A struct representing a node in a binary search tree
struct BSTnode
{
char word[wrdlen];// The contents of the node
struct BSTnode* left;// Links to the node's left and right children
struct BSTnode* right;
};
// Adds a new node to the tree. Duplicates are disallowed. Returns 1 if a
// new node was added, returns 0 if newdata was already in the tree
int insert(struct BSTnode** root, char newword[wrdlen])
{
// If we've reached the right place to insert, create a new node and add it in
if( (*root) == NULL)
{
(*root) = (struct BSTnode*)malloc(sizeof(struct BSTnode));
strcpy((*root)->word,newword);
(*root)->left = NULL;
(*root)->right = NULL;
return 1;
}
// Otherwise, search for the correct place to insert
if(strcmp(newword,(*root)->word)<0)
{
return insert( &((*root)->left), newword);
}
else if(strcmp(newword,(*root)->word)>0)
{
return insert( &((*root)->right), newword);
}
// If the new data is neither less than nor greater than the the data at
// the current node, it must be equal, and duplicates are not allowed
else
return 0;
}
// Returns 1 if target is in the tree and 0 otherwise
int search(struct BSTnode* root, char target[wrdlen])
{
// An empty tree contains nothing, much less target
if(root == NULL)
return 0;
// If the current node is what we're looking for, we've found it
if(strcmp(root->word,target) == 0)
return 1;
// If what we're looking for is smaller than this node, it must be in
// the left subtree if it exists
if(strcmp(target,root->word) < 0)
return search(root->left, target);
// Similarly, if the target is greater than this node, it can only be in
// the right subtree
else
return search(root->right, target);
}
// An iterative version of the search algorithm
int searchiterative(struct BSTnode* root, char target[wrdlen])
{
struct BSTnode* crnt = root;
// Keep descending through the tree until we reach the bottom or find what
// we're looking for
while(crnt != NULL && strcmp(crnt->word,target)!=0)
{
if(strcmp(target,crnt->word)>0)
crnt = crnt->left;
else
crnt = crnt->right;
}
// If we reached the bottom of the tree, then the target isn't present,
// otherwise we found what we're looking for
if(crnt == NULL)
return 0;
else
return 1;
}
void spellcheck(struct BSTnode* root, char *token, int line)
{
//capital letters are from 65 -> 90
//lowercase letters are from 97-122
if(search(root, token))//if you find it normally then
return;
else if(token[0] >= 65 && token[0] <= 90)
{
token[0] = token[0] + 32;
if(search(root, token))
return;
else
{
token[0] = token[0] - 32;
printf("Line %d: %s\n", line, token);
return;
}
}
else
{
printf("Line %d: %s\n", line, token);
return;
}
}
int main(void)
{
FILE *ifp; //dictionary file
FILE *scfp; //file to be spellchecked
char infile[wrdlen]; //"words.txt";
char Tinfile[wrdlen]; //"test.txt"; //test file
int valid = 0;
struct BSTnode* root = NULL;
//struct BSTnode* root;
char newword[wrdlen];
int i = 0;
char str[linelen];
char delims[] = {"~!@#$%^&*()-_=+[]{}\\|;:\'\",.<>/?\n\r\t "};
char *token;
//ask the user for the dictionary file
while(!valid)
{
printf("Please enter the name of the dictionary file you wish to access\n");
scanf("%s", infile);
ifp = fopen(infile, "r");
if(ifp == NULL)
printf("sorry, could not find that file!\n");
else
{
valid = 1;
printf("Reading file now.........\n");
}
}
valid = 0;
//read in all the words and place them into a BST
while(!feof(ifp))
{
fscanf(ifp, "%s ", newword);
insert(&root, newword);
}
//ask the user for the file to be spellchecked
while(!valid)
{
printf("what is the name of the file you would like to spellcheck?\n");
scanf("%s", Tinfile);
scfp = fopen(Tinfile, "r");
if(scfp == NULL)
printf("sorry, could not find that file!\n");
else
{
valid = 1;
printf("Reading file now.........\n");
}
}
printf("The following words were not recognized: \n");
for(i = 1; !feof(scfp); i++)
{
fgets(str, linelen, scfp);
token = strtok(str, delims);
while( token != NULL )
{
spellcheck(root, token, i);
token = strtok( NULL, delims );
}
}
system("PAUSE");
return 0;
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Btw, can you not post that entire dictionary.txt file, please ? It takes ages to download every time the page is refreshed. If you want to post the dictionary file, then use the attachment option.
ASKER
I am sorry I did not realize that I could attach a text file.
the sample output should be:
The following words were not recognized:
Line 1: functions
Line 4: represented
Line 5: rooted
Line 6: strcmp
Line 7: words
Line 9: indicating
Line 10: rooted
Line 10: boi
I am not sure how to get the program to read one line at a time or if it should be somewhere along the lines of reading x number of strings
dictionary.txt
test.txt
the sample output should be:
The following words were not recognized:
Line 1: functions
Line 4: represented
Line 5: rooted
Line 6: strcmp
Line 7: words
Line 9: indicating
Line 10: rooted
Line 10: boi
I am not sure how to get the program to read one line at a time or if it should be somewhere along the lines of reading x number of strings
dictionary.txt
test.txt
>> I am not sure how to get the program to read one line at a time
fgets reads one line of input. So, use that.
But your test.txt file only has one line, so it's logical that all errors are reported on that first line. What's the problem ?
fgets reads one line of input. So, use that.
But your test.txt file only has one line, so it's logical that all errors are reported on that first line. What's the problem ?
ASKER
so how would I create a test file that has more than one line, so that I am sure that it reads each line? So I guess I am asking how do I create a text file with multiple lines?
Just open a text editor, type in some lines of text, and save the file.
ASKER
Thank you it seems it is always the obvious that I over look.
This is the third time in a row that you gave a B grade without an obvious reason, nor an explanation when asked for it.
You really have to start paying attention to your grading. Fyi :
https://www.experts-exchange.com/help.jsp#hi403
You really have to start paying attention to your grading. Fyi :
https://www.experts-exchange.com/help.jsp#hi403
ASKER
I again appologize with the b grade I am not was not aware of the grading scale for this again I would have given an A had I known that it made a difference your help was very useful and helpful and very much appreciated.
Thank you!
Thank you!
That's ok. Just remember next time that grades do serve a purpose.
A B grade suggests that we didn't do as good a job as we could have and/or that the answer wasn't answered completely. Experts like to be given the chance to earn an A grade, so giving a B grade without obvious reason or explanation can rub experts the wrong way.
The grade is also used as a measure of the usefulness of the answer in the PAQ database. So, people looking at this question in the future will know whether the answer resolved the problem or not.
A B grade suggests that we didn't do as good a job as we could have and/or that the answer wasn't answered completely. Experts like to be given the chance to earn an A grade, so giving a B grade without obvious reason or explanation can rub experts the wrong way.
The grade is also used as a measure of the usefulness of the answer in the PAQ database. So, people looking at this question in the future will know whether the answer resolved the problem or not.
ASKER
dictionary.txt