monkey doodle
monkey doodle

Reputation: 700

error in my search linked list implementation

My program doesn't seem to be opening the text files properly. I have a path.txt which is a string representation of all the paths of folders and text files which I have created. When running the program however, it will not output the LINES of the text file the user asked for.

OUTPUT

enter text file
warning: this program uses gets(), which is unsafe.
a1.txt

IT should have output

This is a1

text of a1.txt:

This is a1

text file: path.txt/ this is how my folder is set up with the text files.

a/a1.txt
a/a2.txt
a/b/b3.txt
a/b/b4.txt
a/c/c4.txt
a/c/c5.txt
a/c/d/d6.txt
a/c/d/g
a/c/d/h
a/c/e/i/i7.txt
a/c/f/j/k/k8.txt

code:

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

typedef struct sMyPath{
        char *element;
        struct sMyPath *next;
} tMyPath;


int main(void)
{
        FILE *pFile;
        pFile = fopen("path.txt", "r");
        char inputstr[1024];
        tMyPath *curr, *first = NULL, *last = NULL;

//get the text file, and put it into a string inputstr

        if (pFile != NULL)
        {
                while(!feof(pFile))
                {
                        fgets(inputstr, sizeof(inputstr), pFile);
                }
        fclose(pFile);
        }
        else
        {
                printf("Could not open the file.\n");
        }

//using tokens to get each piece of the string //seperate directories and text files, put it into a link list

char *token = strtok(inputstr, "/");
while (token != NULL)
{
if(last == NULL){
        //creating node for directory
        first = last = malloc (sizeof (*first));
        first -> element = strdup (token);
        first -> next = NULL;
} else {
        last -> next = malloc (sizeof (*last));
        last = last -> next;
        last -> element = strdup (token);
        last -> next = NULL;
}
token = strtok(NULL, "/");
}

//ask user for txt file

char pathU[20];
printf("enter text file\n");
gets(pathU);

//check if text file exist, if yes output entires in text file, else say no

   while(first != NULL)
    {
            if(first -> element == pathU)
            {
                    FILE *nFile;
                    char texxt[300];
                    nFile = fopen(pathU, "r");
                    while (!feof(nFile))
                    {
                            fgets(texxt, 300, nFile);
                            printf("%s", texxt);
                    }

            }

            else if(first == NULL)
            {
                    printf("invalid file name\n");
            }

            else
            {
            first = first -> next;
            }

}
return 0;
}

Upvotes: 0

Views: 156

Answers (2)

VoidPointer
VoidPointer

Reputation: 3107

I understand two possible requirement/implementation.

1) By your implementation, every link-node will contain just filename and directory name and NOT THE PATH-NAME. If you need to store entire pathname, use '\n' as delimiter.

char *token = strtok(inputstr, "\n");

and

token = strtok(NULL, "\n");

This assumes, when your input is a/a1.txt, your current directory contains the directory a and which in-turn contains the file a1.txt.

2) Otherwise, your existing code expects a1.txt to be in current directory, though it contradicts the input file content.


Either way, this below code is culprit,

if(first -> element == pathU)

which compares the pointer and not the string. Replace it as,

 if( strcmp( first -> element, pathU ) == 0 )

I could help better solution if your requirement is more clear..

Upvotes: 1

nullptr
nullptr

Reputation: 11058

The problem seems to be in the string comparison: first -> element == pathU. Here you are comparing pointers, not the characters of the strings. Use strcmp instead: if (strcmp(first -> element, pathU) == 0) ...

Upvotes: 1

Related Questions