Search code examples
stringfilepointersscanffopen

Why can‘t I read the input text file?


I try to read the name of a file using scanf but failed. I am very bad at pointers and could not find the problem. Is there a problem with the pointer to the array of string? Here is my code:

int* Read_file(char* str[])
{
    FILE* fp = fopen(str[1], "r");
    if(fp == NULL)
    {
        printf("File cannot open\n");
        return NULL;
    }
    int rows = 0;
    while(!feof(fp))
    {
        if(fgetc(fp) == '\n')
        {
            rows ++;
        }
    }
    rows ++;
    int* keys = (int*)malloc(3 * rows * sizeof(int));
    fseek(fp, 0L, 0);
    while(!feof(fp))
    {
        for(int i = 0;i < rows;i ++)
        {
            for(int j = 0;j < 3;j ++)
            {
                fscanf(fp,"%d", &keys[(3 * i) + j]);
            }
        }
    }
    fclose(fp);
    return keys;
}
int main()
{
    char* str[20];
    printf("Build_tree ");
    scanf("%s",&str);
    int* keys = Read_file(str);
    return 0;
}

Solution

  • Okay, so the thing is:

    You need a char array to store a string(file-name). So you should use a char array. Instead, you were using an array of char pointers.

    An array is actually a series of memory blocks. The name of the array represents a pointer to the first element of the array(in this case the first char variable).

    While reading a string, scanf needs a location to store it. So you need to give it the address of the first char variable of your char array, which is available in your char array itself. So you have to pass str only to scanf. In the case of normal int,float, and such fundamental data types, their names represent memory blocks and not pointers to memory blocks, and hence you had to use a &.

    Then for fopen, fopen expects a char*(which points to the first character of the char array stoing the filename) and you have to provide it with a char* . So you should pass str.

    I think your code should go like

    int* Read_file(char str[])
    {
        FILE* fp = fopen(str, "r");
        if(fp == NULL)
        {
            printf("File cannot open\n");
            return NULL;
        }
        int rows = 0;
        while(!feof(fp))
        {
            if(fgetc(fp) == '\n')
            {
                rows ++;
            }
        }
        rows ++;
        int* keys = (int*)malloc(3 * rows * sizeof(int));
        fseek(fp, 0L, 0);
        while(!feof(fp))
        {
            for(int i = 0;i < rows;i ++)
            {
                for(int j = 0;j < 3;j ++)
                {
                    fscanf(fp,"%d", &keys[(3 * i) + j]);
                }
            }
        }
        fclose(fp);
        return keys;
    }
    int main()
    {
        char str[20];
        printf("Build_tree ");
        scanf("%s",str);
        int* keys = Read_file(str);
    
        //Whatever you want to do with the keys
    
        return 0;
    }
    

    Comment for any queries.