kvway
kvway

Reputation: 494

How do I find a string in a file?

I'm new at C and recently finished my work with files. I tried to create a program which will find an entered name in a file but it does not work. Could you try to repair it? I'll be thankful.

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

int main()
{
    FILE *fr;
    int i,p,counter,final,length,j,c,k = 0;
    char name[256];
    char buffer[1024];

    fr = fopen("C:/Users/prixi/Desktop/HESLA.TXT","r");
    while ((c = fgetc(fr)) != EOF)
        counter++;

    printf("Enter the name");
    scanf("%s",&name);
    length = strlen(name);

    while (fscanf(fr, " %1023[^\n]", buffer) != EOF) {
        for (i = 0; i <= counter; i++)
            if (name[0] == buffer[i]){
                for (j = 0;j < length; j++ )
                    if (name[j] == buffer[i+j])
                        p++;
                    else
                        p = 0;

              /* The 2nd condition is there because after every name there is ' '. */
              if (p == length && buffer[i+j+1] == ' ')
                  final = 1;
          }
     }

     if ( final == 1 )
         printf("its there");
     else
         printf("its not there"); 
return 0;
}

It loads the inside of the file to the buffer and then scans char by char depending on how long the file is. I know that it's inefficient and slow, but I have been learning C only for like 4 days. I would really like you to help me fixing my own code otherwise :D I probably wont be able to fall asleep.

Upvotes: 0

Views: 135

Answers (2)

Michi
Michi

Reputation: 5297

There are a lot of way to search a string into a File. Try this:

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

char *loadFile(const char *fileName);

int main (void) {
    const char *fileName = "test.txt";
    const char *stringToSearch = "Addams";
    char *fileContent = loadFile(fileName);

    if (strstr(fileContent, stringToSearch)){
        printf("%s was Found\n",stringToSearch);
    }else{
        printf("%s was not Found\n",stringToSearch);
    }

    free(fileContent);

    return 0;
}

char *loadFile(const char *fileName){
    size_t length,size;
    char *buffer;
    FILE *file;

    file = fopen (fileName , "r" );
    if (file == NULL){
        printf("Error fopen, please check the file\t%s\n",fileName);
        exit(EXIT_FAILURE);
    }


    fseek (file , 0 , SEEK_END);
    length = (size_t)ftell (file);
    fseek (file , 0 , SEEK_SET);

    buffer = malloc(length+1);
    if (buffer == NULL){
        fputs ("Memory error",stderr);
        exit (2);
    }

    size = fread (buffer,1,length,file);
    if (size != length){
        fputs ("Reading error",stderr);
        exit(3);
    }
    buffer[length] = '\0';

    fclose (file);
    return buffer;
}

Output:

Addams was Found

I have inside the file "test.txt" the following:

Michael Jackson
Bryan Addams
Jack Sparrow

Upvotes: 3

chqrlie
chqrlie

Reputation: 144695

There are multiple problems with your code. You did not post the variable definitions, so we cannot verify if they are used consistently, especially name that should be an array of char.

The main issue is this: you count the number of bytes in fr by reading it, but you do not rewind the stream before scanning it for instances of the string.

Upvotes: 0

Related Questions