Tuesday 21 January 2014

C - Files

File
      File – A place on disc where group of related data is stored
     E.g. your C programs, executables
     High-level programming languages support file operations
     Naming
     Opening
     Reading
     Writing
     Closing
Steps in Processing a File:
  • Create the stream via a pointer variable using the FILE structure:
    FILE *p;
  •  Open the file, associating the stream name with the file name.
  •  Read or write the data.
  • Close the file.
Defining and opening file
      To store data file in secondary memory (disc) must specify to OS
     Filename (e.g. sort.c, input.data)
     Data structure (e.g. FILE)
     Purpose (e.g. reading, writing, appending)
·         General format for opening file
FILE *fp;  /*variable fp is pointer to type FILE*/
fp = fopen(“filename”, “mode”);
/*opens file with name filename , assigns identifier to fp */
      fp
     contains all information about file
     Communication link between system and program
      Mode can be
     r    open file for reading only
     w   open file for writing only
     a   open file for appending (adding) data
Different modes
      Writing mode ( w)
     if file already exists then contents are deleted,
     else new file with specified name created
      Appending mode (a)
     if file already exists then file opened with contents safe
     else new file created
      Reading mode (r)
     if file already exists then opened with contents safe
     else error occurs. 
Example  for opening a file :
FILE *p1, *p2;
p1 = fopen(“data”,”r”);
p2= fopen(“results”, w”);

Additional modes :
      r+  open to beginning for both reading/writing
      w+  same as w except both for reading and writing
      a+   same as ‘a’ except both for reading and writing
Closing a file :
      File must be closed as soon as all operations on it completed
      Ensures
     All outstanding information associated with file flushed out from buffers
     All links to file broken
     Accidental misuse of file prevented
Syntax:    fclose(file_pointer);
Example:
FILE *p1, *p2;
p1 = fopen(“INPUT.txt”, “r”);
p2 =fopen(“OUTPUT.txt”, “w”);
……..
fclose(p1);
fclose(p2);
      pointer can be reused after closing
Input /Output operations on files :
      C provides several different functions for reading/writing
      getc() – read a character
      putc() – write a character
      fprintf() – write set of data values
      fscanf() – read set of data values
      getw() – read integer
      putw() – write integer
      fgets() – read string from file
      fputs() – write a string onto file
getc() and putc() :
      handle one character at a time like getchar() and putchar()
      syntax:  putc(c,fp1);
     c : a character variable
     fp1 : pointer to file opened with mode w
      syntax: c = getc(fp2);
     c : a character variable
     fp2 : pointer to file opened with mode r
      file pointer moves by one character position after every getc() and putc()
      getc() returns end-of-file marker EOF when file end reached
Program to read/write using getc/putc :
#include <stdio.h>
main()
{           FILE *fp1;
            char c;
            f1= fopen(“INPUT”, “w”);       /* open file for writing */
           
            while((c=getchar()) != EOF)    /*get char from keyboard until CTL-Z*/
                        putc(c,f1);                                            /*write a character to INPUT */
           
            fclose(f1);                                                        /* close INPUT */
            f1=fopen(“INPUT”, “r”);                      /* reopen file */
           
            while((c=getc(f1))!=EOF)        /*read character from file INPUT*/
                        printf(“%c”, c);                                    /* print character to screen */
           
            fclose(f1);
} /*end main */
fscanf() and fprintf() :
      similar to scanf() and printf()
      in addition provide file-pointer
      given the following
     file-pointer f1 (points to file opened in write mode)
     file-pointer f2 (points to file opened in read mode)
     integer variable i
     float variable f
      Example:
                                    fprintf(f1, “%d %f\n”, i, f);
                                    fprintf(stdout, “%f \n”, f);       /*note: stdout refers to screen */
                                    fscanf(f2, “%d %f”, &i, &f);
·         fscanf returns EOF when end-of-file reached
getw() and putw() :
      handle one integer at a time
      syntax:  putw(i,fp1);
     i : an integer variable
     fp1 : pointer to file ipened with mode w
      syntax: i = getw(fp2);
     i : an integer variable
     fp2 : pointer to file opened with mode r
      file pointer moves by one integer position, data stored in binary format native to local system
      getw() returns end-of-file marker EOF when file end reached
THE fgets AND fputs STATEMENTS :
These are useful for reading and writing entire lines of data to/from a file. If buffer is a pointer to a character array and n is the maximum number of characters to be stored, then
      fgets (buffer, n, input_file);
      will read an entire line of text (max chars = n) into buffer until the newline character or n=max, whichever occurs first. The function places a NULL character after the last character in the buffer. The function will be equal to a NULL if no more data exists.
      fputs (buffer, output_file);
      writes the characters in buffer until a NULL is found. The NULL character is not written to the output_file.
Error handling :
      given file-pointer, check if EOF reached, errors while handling file, problems opening file etc.
      check if EOF reached: feof()
      feof() takes file-pointer as input, returns nonzero if all data read and zero otherwise
                                                if(feof(fp))
                                                            printf(“End of data\n”);
      ferror() takes file-pointer as input, returns nonzero integer if error detected  else returns zero
                                                if(ferror(fp) !=0)
                                                            printf(“An error has occurred\n”);
Error while opening file :
      if file cannot be opened then fopen returns a NULL pointer
      Good practice to check if pointer is NULL before proceeding
                        fp = fopen(“input.dat”, “r”);
                       
                        if (fp == NULL)
                                    printf(“File could not be opened \n ”);
Random access to files :
      how to jump to a given position (byte number) in a file without reading all the previous data?
      fseek (file-pointer, offset, position);
      position: 0 (beginning), 1 (current), 2 (end)
      offset: number of locations to move from position
Example:   fseek(fp,-m, 1); /* move back by m bytes from current                                                                                      position */
                  fseek(fp,m,0); /* move to (m+1)th byte in file */
                                         fseek(fp, -10, 2); /* what is this? */
      ftell(fp) returns current byte position in file
rewind(fp) resets position to start of file

No comments:

Post a Comment