I.M.C.A / BCA Semester – 1
C Language
Unit – 5
Unit -5: Pointers and File Handling in C
Contents
9. Use of Pointers in
Dynamic Programming
- A pointer is a variable
that stores the memory address of another variable.
- Declared using * symbol. Example:
int *ptr;.
- If int a = 10;, then ptr = &a;
stores the address of a.
- The operator & is used to get
the address of a variable.
- The operator * (dereference) is
used to access the value stored at that address.
- Pointers provide direct memory
access, making C a powerful language.
- They reduce redundancy by avoiding
multiple copies of data.
- Useful in arrays, strings,
functions, structures, and dynamic memory.
- Pointers are widely used in system
programming and data structures.
- Example:
- int
a=10; int *p=&a; printf("%d", *p); // prints 10
- A pointer can point to a simple
variable.
- Example:
- int
x=5; int *p; p=&x;
- p stores the address of x.
- *p gives the value of x (i.e., 5).
- We can change the variable value
via pointer: *p=20; // x=20.
- This helps in efficient memory
management.
- It reduces the need for returning
multiple values in functions.
- Pointers act as an alias to the
variable.
- Used in function parameters,
reference passing, and memory access.
- Example:
- printf("Address=%p,
Value=%d", p, *p);
- A pointer can point to the first
element of an array.
- Example:
- int
arr[5]={10,20,30,40,50};
- int
*p=arr;
- Here, p points to arr[0].
- *(p+1) gives arr[1].
- Pointers provide an alternate way
of accessing array elements.
- arr[i] is equivalent to *(arr+i).
- This helps in fast iteration
through arrays.
- Used in passing arrays to
functions efficiently.
- Useful in searching, sorting,
and matrix operations.
- Accessing via pointer avoids
copying the entire array.
- An array can also store multiple
pointers.
- Example:
- char
*names[] = {"Raj", "Amit", "Neha"};
- Each element points to a string.
- Useful in handling multiple
strings.
- Instead of 2D character arrays,
array of pointers is memory efficient.
- Can be used in dynamic string
handling.
- Example: Storing file names or
student names.
- Helps in function pointers,
memory tables, and lookup operations.
- Used in programs like command
line arguments.
- It saves memory as only addresses
are stored.
- Pointers can store addresses of structures.
- Example:
- struct
Student {int id; char name[20];};
- struct
Student s1={101,"Raj"}, *p=&s1;
- Access members with p->id
instead of (*p).id.
- -> is called the arrow
operator.
- Useful in linked lists and
dynamic structures.
- Makes memory allocation and
referencing easier.
- Saves memory in passing large
structures to functions.
- Commonly used in file handling
and databases.
- Provides efficient record
management.
- Structures can contain pointer
members.
- Example:
- struct
Student {int *marks; char *name;};
- Useful when memory is allocated
dynamically for strings/arrays.
- Helps in dynamic allocation of
records.
- Used in linked lists, trees, and
graphs.
- Makes structures flexible in size.
- Allows better handling of variable
length data.
- Useful in real-time
applications and data models.
- Helps reduce unnecessary memory
usage.
- Example: Database storing
variable-length names.
- Pointers can be passed to
functions as arguments.
- Provides call by reference
capability.
- Example:
- void
update(int *p){ *p=50; }
- int
main(){ int x=10; update(&x); }
- The original variable changes when
modified inside function.
- This is efficient as no copying of
data occurs.
- Useful in swapping, sorting, and
mathematical operations.
- Allows functions to modify arrays
and structures directly.
- Reduces program complexity.
- Used in memory manipulation and
system programming.
- A pointer can also store the
address of another pointer.
- Declared as int **pp;.
- Example:
- int
x=5; int *p=&x; int **pp=&p;
- **pp gives value of x.
- Helps in handling 2D arrays
and memory tables.
- Useful in function returning a
pointer.
- Provides multi-level indirection.
- Widely used in dynamic memory
allocation (malloc with arrays).
- Common in complex data
structures like linked lists, trees.
- Dynamic memory means allocating
memory at runtime.
- Functions: malloc(), calloc(),
realloc(), free().
- Example:
- int
*p = (int*)malloc(5*sizeof(int));
- Pointers manage heap memory
efficiently.
- Used in building dynamic data
structures like linked lists.
- Useful for applications where size
is not known in advance.
- Prevents wastage of memory.
- Makes program flexible and memory
efficient.
- Example: Storing records of
students when number is unknown.
- Command line arguments allow
passing values to main() function.
- Syntax: int main(int argc, char
*argv[]).
- argc → number of arguments, argv[]
→ argument list.
- Example:
- ./a.out
file.txt
- Here argv[1] =
"file.txt".
- Useful in file operations and
automation scripts.
- Helps in passing file names,
options, inputs.
- Used in Linux commands, utility
programs.
- Makes program flexible without
recompilation.
- Files are used to store data
permanently.
- Unlike variables, file data is not
lost after program ends.
- C provides file handling
functions for reading/writing data.
- Files can be of two types: text
files and binary files.
- File handling is done using FILE
pointer (FILE *fp).
- Example:
- FILE
*fp = fopen("data.txt","w");
- File modes: "r" (read),
"w" (write), "a" (append).
- Helps in data storage,
retrieval, and transfer.
- Used in building databases, word
processors, compilers.
- File handling is the basis of
real-world applications.
1. fopen() → Opens a file
- fopen() is used to open a file and
associate it with a file pointer.
- Syntax: FILE *fp =
fopen("filename.txt", "mode");.
- Modes include: "r"
(read), "w" (write), "a" (append), "r+"
(read/write).
- Returns NULL if the file cannot be
opened.
- Example:
- FILE
*fp = fopen("data.txt", "w");
2. fclose() → Closes a file
- fclose() is used to close a file
opened with fopen().
- It releases memory and ensures
data is written to disk.
- Syntax: fclose(fp);.
- Returns 0 on success, EOF on
error.
- Always close files to prevent data
loss.
3. fprintf(), fscanf() →
Write/read formatted text
- fprintf() writes formatted output
to a file (like printf() but for files).
- fscanf() reads formatted input
from a file (like scanf()).
- Example:
- fprintf(fp, "ID=%d",
101);
- fscanf(fp, "%d",
&id);
4. getw(), putw() → Read/write
integers
- putw() writes an integer to a
file.
- getw() reads an integer from a
file.
- They are simpler alternatives to
fprintf/fscanf for integers.
- Example:
- putw(100, fp);
- int x = getw(fp);
5. fseek(), ftell(), rewind() →
Move file pointer
- fseek() moves the file pointer to
a specific position.
- ftell() returns the current
position of the pointer.
- rewind() sets the file pointer to
the beginning.
- Example:
- fseek(fp, 0, SEEK_END);
- long pos = ftell(fp);
- rewind(fp);
6. freopen() → Reopen file with
new mode
- freopen() opens an already open
file with a new mode.
- Useful for redirecting standard
input/output to files.
- Syntax:
freopen("file.txt", "w", stdout);.
- Example: redirecting output of
printf to a file.
7. remove(), rename() →
Delete/rename file
- remove("file.txt");
deletes a file from disk.
- rename("old.txt","new.txt");
renames a file.
- Both return 0 on success, -1 on
failure.
- Commonly used in file management
programs.
8. feof(), ferror() → End-of-file,
error checking
- feof(fp) checks if the end of file
has been reached.
- ferror(fp) checks if an error
occurred during file operations.
- Useful in reading loops.
- Example:
- while(!feof(fp)) { ch=getc(fp); }
9. fflush() → Clear buffer
- fflush(fp) forces writing of
buffered data to the file.
- Useful when using output
buffering.
- For stdout, it clears console
buffer.
- Prevents data loss when program
crashes.
10. fgetpos(), fsetpos() → Get/set
file position
- fgetpos(fp, &pos) stores
current position in pos.
- fsetpos(fp, &pos) sets the
file pointer to saved position.
- Provides portable file positioning
across platforms.
- Useful in structured file reading.
11. sprintf(), snprintf() → Write
formatted data into string
- sprintf() writes formatted output
into a string instead of a file.
- snprintf() does the same but
prevents buffer overflow by limiting characters.
- Example:
- char str[50];
- sprintf(str, "Value =
%d", 10);
12. vsprintf(), vsnprintf() →
Variadic versions of sprintf
- These are like sprintf/snprintf
but accept variable argument lists.
- Used with functions like va_list.
- Safer when writing library
functions.
- Example: logging frameworks.
13. vfscanf() → Scan input with
variable arguments
- Similar to fscanf(), but takes
variable arguments using va_list.
- Useful in generic input processing
functions.
- Allows flexible parsing of file
data.
- Example: custom format scanners.
14. setbuf(), setvbuf() → Set file
buffering
- setbuf(fp, buffer) sets a buffer
for file stream.
- setvbuf(fp, buffer, mode, size)
gives more control (modes: full, line, none).
- Helps optimize file I/O
performance.
- Example: large file reading
efficiency improvement.
- Files support Input (reading)
and Output (writing) operations.
- Reading:
fscanf(fp,"%d",&x); → reads from file.
- Writing:
fprintf(fp,"%d",x); → writes to file.
- Binary I/O: fread(), fwrite().
- Allows structured data storage.
- Handles large datasets
efficiently.
- Avoids memory loss after program
ends.
- Example: Reading student records
from a file.
- Used in applications like
banking, hospital management, OS logs.
Thank
You
::
Any Query ::
Contact:
Ruparel Education Pvt. Ltd.
Mobile
No: 7600044051