954,492 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Counting words from a text document.

#include <stdio.h>
#include <string.h>

int main()
{
    int count = 0;
    char *doc;
    FILE *inp;
    
    printf("Enter the file name: ");
    scanf("%s", doc);
    
    inp=fopen(doc, "r");
    
    while((doc = fgetc(doc)) != EOF)
    {
        if (doc == ' ')
            count++;
    }

    fclose(doc);
    
    printf("%s contains %d words\n",doc,count);
    
    return 0;
}


So basically I'm a little bit confused. I believe the logic of my program is correct; file pointer is declared, and I do have a character to store my array, it reads the file, and counts all the words pending a space in front/between/etc. Basically the program should ask the used the used to input the name of the file they're scanning. The file opens and goes through the program and outputs a line that tells the user the # of words in the file that was inputted.

My problem has been compiling it.

I'm getting this:

wordcount.c: In function ‘main’:
wordcount.c:13:5: warning: passing argument 1 of ‘fopen’ makes pointer from integer without a cast [enabled by default]
/usr/include/stdio.h:271:14: note: expected ‘const char * __restrict__’ but argument is of type ‘char’
wordcount.c:15:5: warning: passing argument 1 of ‘fgetc’ makes pointer from integer without a cast [enabled by default]
/usr/include/stdio.h:535:12: note: expected ‘struct FILE *’ but argument is of type ‘char’
wordcount.c:21:5: warning: passing argument 1 of ‘fclose’ makes pointer from integer without a cast [enabled by default]
/usr/include/stdio.h:236:12: note: expected ‘struct FILE *’ but argument is of type ‘char’

MrNo
Newbie Poster
10 posts since Oct 2011
Reputation Points: 5
Solved Threads: 0
 

So basically I'm a little bit confused. I believe the logic of my program is correct; file pointer is declared, and I do have a character to store my array, it reads the file, and counts all the words pending a space in front/between/etc. Basically the program should ask the used the used to input the name of the file they're scanning. The file opens and goes through the program and outputs a line that tells the user the # of words in the file that was inputted.

My problem has been compiling it.


How can it possibly do all that stuff you claim it does if the program doesn't even compile? The mind boggles! :icon_rolleyes:


Your code:

#include <stdio.h>
#include <string.h>

int main()
{
    int count = 0;
    char *doc;              // Where is the actual storage?  A pointer 
                            //   does not hold data, it holds a pointer
    FILE *inp;
    
    printf("Enter the file name: ");
    scanf("%s", doc);       // See the scanf() link below
    
    inp=fopen(doc, "r");    // Why are you opening the file with a char*? 
                            //   Aren't you supposed to use a FILE pointer?
    
    while((doc = fgetc(doc)) != EOF)    // You get a character and
                                        // 1) destroy your file pointer
                                        // 2) destroy your character pointer.
    {
        if (doc == ' ')     // doc is a pointer.  It can't be == to a character.
            count++;
    }

    fclose(doc);
    
    printf("%s contains %d words\n",doc,count);
    
    return 0;
}


scanf()

WaltP
Posting Sage w/ dash of thyme
Moderator
10,505 posts since May 2006
Reputation Points: 3,348
Solved Threads: 944
 

Here comes captain douchebag thinking thread is someone asking another to write the code for them.

MrNo
Newbie Poster
10 posts since Oct 2011
Reputation Points: 5
Solved Threads: 0
 
#include <stdio.h>
#include <string.h>

int main()
{
    int count = 0;
    char *doc;
    FILE *inp;
    
    printf("Enter the file name: ");
    scanf("%s", doc);
    
    inp=fopen(doc, "r");
    
    while((doc = fgetc(doc)) != EOF)
    {
        if (doc == ' ')
            count++;
    }

    fclose(doc);
    
    printf("%s contains %d words\n",doc,count);
    
    return 0;
}

So basically I'm a little bit confused. I believe the logic of my program is correct; file pointer is declared, and I do have a character to store my array, it reads the file, and counts all the words pending a space in front/between/etc. Basically the program should ask the used the used to input the name of the file they're scanning. The file opens and goes through the program and outputs a line that tells the user the # of words in the file that was inputted.

My problem has been compiling it.

I'm getting this:

wordcount.c: In function ‘main’: wordcount.c:13:5: warning: passing argument 1 of ‘fopen’ makes pointer from integer without a cast [enabled by default] /usr/include/stdio.h:271:14: note: expected ‘const char * __restrict__’ but argument is of type ‘char’ wordcount.c:15:5: warning: passing argument 1 of ‘fgetc’ makes pointer from integer without a cast [enabled by default] /usr/include/stdio.h:535:12: note: expected ‘struct FILE *’ but argument is of type ‘char’ wordcount.c:21:5: warning: passing argument 1 of ‘fclose’ makes pointer from integer without a cast [enabled by default] /usr/include/stdio.h:236:12: note: expected ‘struct FILE *’ but argument is of type ‘char’


The root of all problems in your program is this line

char *doc;


Walt is right ,"A pointer does not hold a data, it holds a pointer" i.e the address of where the data actually is.You better declare an array of chars

char file_path[25];

or you have to allocate memory for the data using malloc.

char* file_path;
if((file_path=malloc(25))==NULL)
    exit(1);//couldn't allocate memory

Though you can use scanf,

scanf("%s",file_path);


I'd recommend fgets() instead

if((fgets(file_path,sizeof(file_path),stdin))!=NULL){
char *ptr=strchr(file_path,'\n'); //replace the trailing zero     
*ptr='\0';//with '\0' character
}


You also better check if the file you're going to open exists or not,

if((inp=fopen(file_path,"r"))==NULL)
    exit(1);//exit if couldn't open the file

Use another int variable while reading characters from the file, since fgetc returns an int.

int c;
while((c = fgetc(inp)) != EOF){
    if (c == ' ')// now the comparision is possible    
        count++;
}

and finally, fclose takes file handle as it's only argument.So it should be

fclose(inp);
diwakar wagle
Posting Whiz in Training
203 posts since Nov 2008
Reputation Points: 48
Solved Threads: 31
 
Here comes captain douchebag thinking thread is someone asking another to write the code for them.

What the h--- are you talking about?

Your description claims everything was working. I commented on that. Nothing is working.

I then added comments in your code showing what was wrong with the code itself?
Where do you get the asinine idea I thought you were asking for us to write it for you? Please, explain how you got that impression? I need to know... Please.

WaltP
Posting Sage w/ dash of thyme
Moderator
10,505 posts since May 2006
Reputation Points: 3,348
Solved Threads: 944
 

@MrNo - What the h... dude? Walt is actually giving you assistance with your code, NOT writing it for you, and encouraging you to develop your understanding and knowledge your damn self

Stop being a complete ass and learn a thing or 2, your comment you state you've only been learning this on the side for a while? so LEARN!!! dont mope and insult people encouraging that...

This forum is actually a set of decent people helping each other and you attitude is simply going to make LOADS of people ignore you and not offer any assistance any more...

Eagletalon
Junior Poster
113 posts since Mar 2011
Reputation Points: 47
Solved Threads: 13
 

@MrNo - What the h... dude? Walt is actually giving you assistance with your code, NOT writing it for you, and encouraging you to develop your understanding and knowledge your damn self

Stop being a complete ass and learn a thing or 2, your comment you state you've only been learning this on the side for a while? so LEARN!!! dont mope and insult people encouraging that...

This forum is actually a set of decent people helping each other and you attitude is simply going to make LOADS of people ignore you and not offer any assistance any more...


Although the thread is posted pretty recently(just November last year and his last activity being december 2nd) I don't think MrNo will give a proper explanation less likely a proper reply, I think this thread should be left alone now or maybe closed... just saying

zeroliken
Veteran Poster
1,106 posts since Nov 2011
Reputation Points: 201
Solved Threads: 162
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You