user3005945
user3005945

Reputation: 51

c code text not displayed

iv'e written a part of a code which basically transfers text from a txt file into a variable and prints it(as a part of a program),yet it does not print the contents at all.

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

#define WRONG_ARGUMENTS     (-1)

int Lines(FILE * file);
int Length(FILE * file);
int Read(FILE * file);
int Lines(FILE * file)
                {
                    int c=0,count=0;
                    ++count;
                    while(c!=EOF)
                    {
                        c=fgetc(file);
                        if(c=='\n')
                            ++count;
                    }
                    return count;
                }
                int Length(FILE * file)
                {
                    int c,count=0;
                    while((c=fgetc(file))!=EOF)
                    {
                        ++count;
                    }
                    return count;
                }

         int Reader(FILE * Text,char * File)
         {
             int counter=0;
             while(fscanf(Text,"%s",File)!=EOF)
             {
                 ++counter;
                 strcat(File," ");
             }
             return counter;
         }
int main(int argc,char * argv[]) {
    FILE * Text=NULL;


    if(argc!=2)
    {
        printf("usage:library text dictionary\n");
        return -1;
    }
    Text = fopen(argv[1],"r");
    if(Text==NULL)
    {
        printf("file %s could not be opened\n",argv[1]);
        return -1;
    }

        char * File = "";
         File=malloc(Length(Text)*(sizeof(char)));

int r = Reader(Text,File);
printf(File);

return 0;
}

i will be more than glad to understand the problem in the partial code the output is x>

thanks,

Upvotes: 0

Views: 93

Answers (1)

enhzflep
enhzflep

Reputation: 13089

Consider the following cut-down example. You'll notice that the getFileLength function (a) doesn't actually read anything from the file and (b) makes use of the fseek and ftell functions - fseek is the function that you use to reposition the file-pointer when it reaches EOF.

Imagine that you weren't printing the data, but doing something else with it. What if the file is a billion bytes long? We sure don't want to read 1,000,000,000 times from it just to determine its length!

As for the use of calloc - it zero initializes the data it allocates. Since you're reading text, you want to ensure that the text is NULL-terminated. (NULL generally = 0, though I've seen evil macros that change this) This NULL terminator is also why I allocate 1 byte more than the file contains.

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

long getFileLength(FILE *input)
{
    long result;
    long origPos = ftell(input);
    fseek(input, 0, SEEK_END);
    result = ftell(input);
    fseek(input, origPos, SEEK_SET);
    return result;
}

int main (void)
{
    FILE *fp;
    long fileLen, numBytesRead;
    char *data;

    fp = fopen("main.cpp", "rb");
    fileLen = getFileLength(fp);
    data = (char*)calloc(sizeof(char), fileLen+1);
    numBytesRead = fread(data, sizeof(char), fileLen, fp);
    if (numBytesRead != fileLen)
        printf("Error reading all bytes from file. Expected: %d, Read %d\n", fileLen, numBytesRead);
    else
        printf("%s", data);
    free(data);
    fclose(fp);
}

Upvotes: 1

Related Questions