C program to find occurrence of a word in file

Write a C program to find occurrence of a word in file. How to find first or last occurrence of a word in file in C programming. Logic to find occurrence of a word in file in C program. How to search first and last occurrence of a word in file in C programming.

Required knowledge

Basic Input Output, String, Functions, Pointers, File Handling

Logic to find occurrence of a word in file

Step by step descriptive logic to find first occurrence of a word in file.

  1. Input source file in which you need to search, store its reference to fptr.
  2. Input word to search in file, store it in some variable say word.
  3. Initialize two variables line = -1 and col = -1. They will store index of line and column of searched word in file.
  4. Read a line from file, store it in str.
  5. Increment line count by one.
  6. Find first index of word in str and store it in col. If word is found in str then print line and col which is required index and jump to step 8.

    Now, here's the tricky part. I have used strstr() C library function. It returns pointer to first occurrence of a given word in a string. To find first occurrence of word in str use pos = strstr(str, word); (where pos is pointer to character).

    pos will point to first occurrence of word in str if exists, otherwise points to NULL. Check if(pos != NULL) then find column index using col = pos - str.

  7. Repeat step 4-6 till end of file.
  8. Close fptr file to release all resources.

Program to find occurrence of a word in file

/**
 * C program to find first occurrence of a word in file.
 */

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


#define BUFFER_SIZE 1000


/* Function declarations */
int indexOf(FILE *fptr, const char *word, int *line, int *col);


int main()
{
    FILE *fptr;
    char path[100];

    char word[50];

    int line, col;


    /* Input file path */
    printf("Enter file path: ");
    scanf("%s", path);

    /* Input word to search in file */
    printf("Enter word to search in file: ");
    scanf("%s", word);


    /* Try to open file */
    fptr = fopen(path, "r");

    /* Exit if file not opened successfully */
    if (fptr == NULL)
    {
        printf("Unable to open file.\n");
        printf("Please check you have read/write previleges.\n");

        exit(EXIT_FAILURE);
    }


    // Find index of word in fptr
    indexOf(fptr, word, &line, &col);

    if (line != -1)
        printf("'%s' found at line: %d, col: %d\n", word, line + 1, col + 1);
    else
        printf("'%s' does not exists.", word);
    

    // Close file
    fclose(fptr);

    return 0;
}


/**
 * Finds, first index of a word in given file. First index is represented
 * using line and column.
 */
int indexOf(FILE *fptr, const char *word, int *line, int *col)
{
    char str[BUFFER_SIZE];
    char *pos;

    *line = -1;
    *col  = -1;

    while ((fgets(str, BUFFER_SIZE, fptr)) != NULL)
    {
        *line += 1;

        // Find first occurrence of word in str
        pos = strstr(str, word);

        if (pos != NULL)
        {
            // First index of word in str is 
            // Memory address of pos - memory
            // address of str.
            *col = (pos - str);
            break;
        }
    }


    // If word is not found then set line to -1
    if (*col == -1)
        *line = -1;

    return *col;
}

Wondering how (pos - str) gives index of occurrence of word. Then, please give a moment to read pointer arithmetic in C programming.

Suppose data/file3.txt contains.

I love programming.
I am learning C programming at Codeforwin.
Programming with files is fun.
Learning C programming at Codeforwin is simple and easy.

Output

Enter file path: data/file3.txt
Enter word to search in file: Codeforwin
'Codeforwin' found at line: 2, col: 32

Logic to find last occurrence of a word is almost similar. I am leaving logic to you, so that you can practice a bit. However, I have written program to find last index of a word in file.

Program to find last occurrence of a word in file

/**
 * C program to find last occurrence of a word in file.
 */

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

#define BUFFER_SIZE 1000

/* Function declarations */
int lastIndexOf(FILE *fptr, const char *word, int *line, int *col);


int main()
{
    FILE *fptr;
    char path[100];

    char word[50];

    int line, col;

    /* Input file path */
    printf("Enter file path: ");
    scanf("%s", path);

    /* Input word to search in file */
    printf("Enter word to search in file: ");
    scanf("%s", word);

    /* Try to open file */
    fptr = fopen(path, "r");

    /* Exit if file not opened successfully */
    if (fptr == NULL)
    {
        printf("Unable to open file.\n");
        printf("Please check you have read/write previleges.\n");

        exit(EXIT_FAILURE);
    }

    // Find last index of word in str
    lastIndexOf(fptr, word, &line, &col);


    if (line != -1)
        printf("Last index of '%s' line: %d, col: %d\n", word, line + 1, col + 1);
    else
        printf("'%s' does not exists.", word);

    // Close file
    fclose(fptr);

    return 0;
}

/**
 * Finds, last index of a word in given file. Last index is represented
 * using line and column. 
 */
int lastIndexOf(FILE *fptr, const char *word, int *line, int *col)
{
    char str[BUFFER_SIZE];
    char *pos;

    int lfound, cfound;

    *line = -1;
    *col = -1;
    lfound = -1;
    cfound = -1;

    while ((fgets(str, BUFFER_SIZE, fptr)) != NULL)
    {
        *line += 1;
        *col = -1;

        // Find next occurrence of word in str
        while ((pos = strstr(str + *col + 1, word)) != NULL)
        {
            // Index of word in str is
            // Memory address of pos - memory
            // address of str.
            *col = (pos - str);

            // Mark current line as word found at
            // this line and col.
            lfound = *line;
            cfound = *col;
        }
    }

    // If word is not found then set line to -1
    if (cfound == -1)
    {
        *line = -1;
        *col = -1;
    }
    else
    {
        // Make sure line contains last found index
        *line = lfound;
        *col = cfound;
    }

    return *col;
}

Output

Enter file path: data/file3.txt
Enter word to search in file: Codeforwin
Last index of 'Codeforwin' line: 4, col: 27

Happy coding 😉

About Pankaj

Pankaj Prakash is the founder, editor and blogger at Codeforwin. He loves to learn new techs and write programming articles especially for beginners. He works at Vasudhaika Software Sols as a Software Design Engineer and manages Codeforwin. In short Pankaj is Web developer, Blogger, Learner, Tech and Music lover.

Comments and discussion
Have a doubt, write here. I will help my best.
Before commenting you must escape your source code before commenting. Paste your source code inside
<pre><code> ----Your Source Code---- </code></pre>