text
Your paragraph text yt fb in ln wp
Module IV
Pointers and Files-Basics of Pointer: declaring pointers, accessing data though pointers, NULL
pointer,array access using pointers, pass by reference effect. File Operations: open, close, read,
write, append Sequential access and random access to files: In built file handling functions
(rewind() ,fseek(), ftell(),feof(), fread(), fwrite()), simple programs covering pointers and files.
POINTERS
The pointer in C language is a variable which stores the address of another variable.
This variable can be of type int, char, array, function, or any other pointer. The size of the
pointer depends on the architecture. However, in 32-bit architecture the size of a pointer is
2 byte.
Consider the following example to define a pointer which stores the address of an
integer variable.
int n = 10;
int *p = &n; // Variable p of type pointer is pointing to the address of the variable n of type
integer.
Declaration of Pointer Variable
The pointer in C language can be declared using * (asterisk symbol). It is also known
as indirection operator used to dereference a pointer.
datatype *ptrvar;
where ptrvar is any identifier
int *a; //pointer to integer
char *c; //pointer to char
Initialization of Pointer Variable
The process of assigning the address of a variable to a pointer variable is known as
initialization. All uninitialized pointers have some garbage value so it should be initialized.
Example
int a;
int *p; //declaration
p=&a; //initialization
IIPE 1
Accessing Data through Pointers
A variable can be accessed through its pointer using unary operator ’*’. Also known
as indirection operator or dereferencing operator.
Consider the following example:
#include<stdio.h>
void main()
{
int n = 10;
int *p;
p = &n;
printf("Address of n=%u\n",&n);
printf("Value of n=%d\n",n);
printf("Address of p=%u\n",&p);
printf("Value of p=%u\n",p);
printf("Value of *p=%d\n",*p); // *p = value of n;
}
OUTPUT
Address of n=6487628
Value of n=10
Address of p=6487616
Value of p=6487628
Value of *p=10
Each variable has two properties: address and value. Address of a variable is the
memory location allocated for that variable. Value of a variable is the value stored in the
memory location allocated to them. The address of a variable can be derived using address
of (&) operator. In the example above, the address of n is 6487628 and value is 10.
Variable Name Address Value
n 6487628 10
When p is assigned with &n, p stores the address of n. Thus p points to n. In order to
retrieve the value of n, we can make use of *p.
Pointer Name Address of p Value of p Asterisk Value(*p)
6487628 10
p 6487616
Address of variable n Value of n
IIPE 2
NULL Pointer
A pointer that is not assigned any value but NULL is known as the NULL pointer. If
you don't have any address to be specified in the pointer at the time of declaration, you can
assign NULL value. It will provide a better approach.
int *p=NULL;
OPERATIONS ON POINTERS
• Address of a variable can be assigned to a pointer variable.
• One pointer variable can be assigned to another pointer variable provided both
points to the items of same datatype.
• A NULL value can be assigned to a pointer variable.
• An integer quantity can be added to or subtracted from a pointer variable. The
result will be a pointer.
• When we increment a pointer, its value is increased by the length of its data type.
• One pointer variable can be subtracted from another pointer variable provided both
points to the elements of the same array. The result will be an integer value.
• Two pointer variables can be compared provided both points to the items of same
datatype.
• A pointer variable can be compared with NULL values.
Write a program to find the sum of two numbers using pointers
#include<stdio.h>
void main()
{
int x,y,sum,*xp,*yp;
printf("Enter value of x:");
scanf("%d",&x);
printf("Enter value of y:");
scanf("%d",&y);
xp=&x;
yp=&y;
sum=*xp+*yp;
printf(" Sum is %d \n",sum);
}
OUTPUT
Enter value of x:10
IIPE 3
Enter value of y:20
Sum is 30
Write a program to swap two variables using pointers
include<stdio.h>
void main()
{
int x=10,y=20, temp,*a,*b;
printf("\nBefore Swapping");
printf("\nValue of x is %d",x); //output 10
printf("\nValue of y is %d ",y); //output 20
a=&x;
b=&y;
temp= *a;
*a= *b;
*b=temp;
printf("\nAfter swapping");
printf("\nValue of x is %d \n",x); //output 20
printf("\nValue of y is %d \n",y); //output 10
}
OUTPUT
Before Swapping
Value of x is 10
Value of y is 20
After swapping
Value of x is 20
Value of y is 10
POINTERS AND ARRAY
• In C programming, name of the array always points to address of the first element of
an array.
Array Access using Pointers
1) Write a program to read and display an array using pointer.
#include<stdio.h>
#include<malloc.h>
void main()
{
int p[30],i,n;
IIPE 4
printf("Enter the size of array:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",p+i);
}
printf("Array Content\n");
for(i=0;i<n;i++)
{
printf("%d\t",*(p+i));
}
}
OUTPUT
Enter the size of array:5
10 15 20 25 30
Array Content
10 15 20 25 30
2) Write a program to sort the content of an array using pointers
#include<stdio.h>
#include<malloc.h>
void main()
{
int i,n,temp,j;
int *p = malloc(30 * sizeof(int)); // equivalent to int p[30];
printf("Enter the size of array:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",p+i);
}
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(*(p+j) > *(p+j+1))
{
temp = *(p+j);
*(p+j) = *(p+j+1);
*(p+j+1) = temp;
}
}
}
printf("Array Content\n");
IIPE 5
for(i=0;i<n;i++)
{
printf("%d\t",*(p+i));
}
}
OUTPUT
Enter the size of array:5
16 7 14 2 5
Array Content
2 5 7 14 16
POINTER TO POINTER
A pointer points to an address of another pointer. Such pointers are known
as pointer to pointer or double pointers.
Example
#include<stdio.h>
void main()
{
int a=10;
int *p,**q;
p=&a;
q=&p;
printf("\nValue of a is %d \n",a);
printf("\nValue of *p is %d \n",*p);
printf("\nValue of **q is %d \n ",**q);
}
OUTPUT
Value of a is 10
Value of *p is 10
Value of **q is 10
PASS BY REFERENCE
In C programming, it is also possible to pass addresses as arguments to functions. To
accept these addresses in the function definition, we can use pointers. In this method, the
address of the actual parameters is passed to formal parameters. So any change in formal
parameters will be reflected in the actual parameters.
Consider the program to swap two numbers using pass by reference method,
IIPE 6
#include<stdio.h>
int swap(int *a,int *b)
{
int temp=*a;
*a= *b;
*b=temp;
}
void main()
{
int x,y;
printf("\nEnter the numbers:");
scanf("%d%d",&x,&y);
printf("\nBefore swapping : x=%d\ty=%d\n",x,y);
swap(&x,&y);
printf("\nAfter swapping : x=%d\ty=%d",x,y);
}
OUTPUT
Enter the numbers:10 20
Before swapping: x=10 y=20
After swapping: x=20 y=10
Differences between pass by value and pass by reference
Pass by Value Pass by Reference
In call by value, a copy of actual arguments is In call by reference, the location (address) of
passed to formal arguments of the called actual arguments is passed to formal
function and any change made to the formal arguments of the called function. This means
arguments in the called function have no by accessing the addresses of actual
effect on the values of actual arguments in arguments we can alter them within from
the calling function. the called function.
In call by reference, alteration to actual
arguments is possible within from called
In call by value, actual arguments will remain
function; therefore the code must handle
safe, they cannot be modified accidentally.
arguments carefully else you get unexpected
results.
IIPE 7
FILES
A file is a collection of related data that a computer treats as a single unit. Computers
store files to secondary storage so that the contents of files remain intact when a computer
shuts down. When a computer reads a file, it copies the file from the storage device to
memory; when it writes to a file, it transfers data from memory to the storage device. When
a program is terminated, the entire data is lost. Storing in a file will preserve your data even
if the program terminates. It is easy to move the data from one computer to another
without any changes. C uses a structure called FILE (defined in stdio.h) to store the
attributes of a file. When working with files, you need to declare a pointer of type FILE. This
declaration is needed for communication between the file and the program.
FILE *fp; // *fp – file pointer variable
Types of Files
There are two types of files
• Text files
• Binary files
1. Text files
Text files are the normal .txt files. You can easily create text files using any simple
text editors such as Notepad. When you open those files, you'll see all the contents within
the file as plain text. It is easy to edit or delete the contents. They take minimum effort to
maintain, are easily readable, and provide the least security and takes bigger storage space.
2. Binary files
Binary files are mostly the .bin files in the computer. Instead of storing data in plain
text, they store it in the binary form (0's and 1's). They can hold a higher amount of data,
are not readable easily, and provides better security than text files.
FILE OPERATIONS
1) Opening a file
IIPE 8
A file must be “opened” before it can be used. Opening a file is performed using the
fopen() function defined in the stdio.h header file.
The syntax for opening a file in standard I/O is:
FILE *fp
fp = fopen("filename","mode");
– fp is declared as a pointer to the data type FILE.(C has a special "data type" for handling
files which is defined in the standard library 'stdio.h '.)
It is called the file pointer and has the syntax FILE*.
– filename is a string - specifies the name of the file.
– fopen returns a pointer to the file which is used in all subsequent file operations.
File Opening Mode
Sl. No Mode Description
1 r Opens an existing text file for reading purpose.
Opens a text file for writing. If it does not exist, then a new file is
2 w created. Here your program will start writing content from the
beginning of the file.
Opens a text file for writing in appending mode. If it does not
3 a exist, then a new file is created. Here your program will start
appending content in the existing file content.
4 r+ Opens a text file for both reading and writing.
Opens a text file for both reading and writing. It first truncates the
5 w+ file to zero length if it exists, otherwise creates a file if it does not
exist.
Opens a text file for both reading and writing. It creates the file if
6 a+ it does not exist. The reading will start from the beginning but
writing can only be appended.
IIPE 9
File Location
We can provide the relative address of the file location or absolute address of the
file. Consider your working directory is C:\CP\Test\ . Now you want to open a file hello.c in
read mode. Two ways to provide the file location are as given below:
fp = fopen("hello.c","r");
OR
fp = fopen("C:\\CP\\Test\\hello.c","r")
2. Closing a file
The file (both text and binary) should be closed after reading/writing. Closing a file
is performed using the fclose() function.
fclose(fp);
Here, fp is a file pointer associated with the file to be closed.
– fclose() function closes the file and returns zero on success, or EOF if there is an error
in closing the file.
– This EOF is a constant defined in the header file stdio.h.
3. Reading and writing to a file
Sl. No Function Name Description Syntax
1 fgetc To read a character from a file ch = fgetc(fp)
2 fputc To write a character to a file fputc(ch,fp)
3 fscanf To read numbers, strings from a fscanf(fp,"%d",&n)
file
4 fprintf To write numbers, strings to a file fprintf(fp,"%d",n)
5 fread To read binary content from a Refer Note
file. It is used to read structure
content.
6 fwrite To write as binary content to a Refer Note
file.
Note:
IIPE 10
1) The only difference is that fprintf() and fscanf() expects a pointer to the structure
FILE.
2) To write into a binary file, you need to use the fwrite() function. The functions
take four arguments:
• Address of data to be written in the disk
• Size of data to be written in the disk
• Number of such type of data
• Pointer to the file where you want to write.
fwrite(addressData, sizeData, numbersData, pointerToFile);
3) Function fread() also take 4 arguments similar to the fwrite() function as above.
fread(addressData, sizeData, numbersData, pointerToFile);
feof()
The C library function int feof(FILE *stream) tests the end-of-file indicator for the
given stream. This function returns a non-zero value when End-of-File indicator associated
with the stream is set, else zero is returned.
RANDOM ACCESS TO A FILE
1) rewind()
The rewind() function sets the file pointer at the beginning of the stream. It is useful if
you have to use stream many times.
Syntax: rewind(file pointer)
2) fseek()
If you have many records inside a file and need to access a record at a specific position,
you need to loop through all the records before it , to get the record. This will waste a lot of
memory and operation time. An easier way to get to the required data can be achieved
using fseek().
fseek(FILE * stream, long int offset, int pos);
IIPE 11
The first parameter stream is the pointer to the file. The second parameter is the
position of the record to be found, and the third parameter specifies the location where the
offset starts.
Different positions in fseek()
Position Meaning
SEEK_SET Starts the offset from the beginning of the file.
SEEK_END Starts the offset from the end of the file.
SEEK_CUR Starts the offset from the current location of the cursor in the
file.
3) ftell()
ftell() in C is used to find out the position of file pointer in the file with respect to
starting of the file.
Syntax of ftell() is:
ftell(FILE *pointer)
Difference between sequential and random access
Sequential file access is the method employed in tape drives where the files are
accessed in a sequential manner. So if you have to get a file in the end of the tape you have
to start from the beginning till it reaches the beginning of the file.
Random access files are similar to the one in Hard Disks and Optical drives,
wherever the files is placed it will go to that particular place and retrieve it.
Accessing data sequentially is much faster than accessing it randomly because of the
way in which the disk hardware works.
IIPE 12
1) Write a program to display the content of a file.
#include<stdio.h>
void main()
{
FILE *fp;
char ch;
fp = fopen("test.txt","r");
while(feof(fp) == 0)
{
ch=fgetc(fp);
printf("%c",ch);
}
fclose(fp);
}
Content of test.txt
Hello, Welcome to C Programming Lectures.
OUTPUT
Hello, Welcome to C Programming Lectures.
2) Write a program to count number of vowels in a given file.
#include<stdio.h>
void main()
{
FILE *fp;
char ch;
int countV=0;
fp = fopen("test.txt","r");
while(feof(fp) == 0)
{
ch=fgetc(fp);
if(ch == 'a' || ch == 'A' || ch=='e' ||ch=='E' || ch == 'I' || ch == 'i' ||ch == 'O' ||
ch=='o' || ch == 'U' ||ch == 'u')
{
countV++;
}
}
printf("Count of Vowels=%d",countV);
fclose(fp);
}
Content of test.txt
Hello, Welcome to C Programming Lectures.
IIPE 13
OUTPUT
Count of Vowels=12
3) Write a program to copy the content of one file to another.
#include<stdio.h>
void main()
{
FILE *f1,*f2;
char ch;
f1 = fopen("test.txt","r");
f2 = fopen("copy.txt","w");
while(feof(f1) == 0)
{
ch=fgetc(f1);
fputc(ch,f2);
}
printf("Successfully Copied");
fclose(f1);
fclose(f2);
}
Content of test.txt
Hello, Welcome to C Programming Lectures.
OUTPUT
Successfully Copied
Content of copy.txt
Hello, Welcome to C Programming Lectures.
4) Write a program to merge the content of two files.
#include<stdio.h>
void main()
{
FILE *f1,*f2,*f3;
char ch;
f1 = fopen("file1.txt","r");
f2 = fopen("file2.txt","r");
f3 = fopen("merge.txt","w");
while(feof(f1) == 0)
{
ch=fgetc(f1);
fputc(ch,f3);
}
while(feof(f2) == 0)
{
IIPE 14
ch=fgetc(f2);
fputc(ch,f3);
}
printf("Successfully Merged");
}
Content of file1.txt
Hello, Welcome to C Programming Lectures.
Content of file2.txt
C is very easy to learn.
OUTPUT
Successfully Merged
Content of merge.txt
Hello, Welcome to C Programming Lectures. C is very easy to learn.
5) Write a program to read numbers from a file and display the largest number.
#include<stdio.h>
void main()
{
FILE *f1;
int large,num;
f1 = fopen("number.txt","r");
fscanf(f1,"%d",&large); // setting first element as largest element
while(feof(f1) == 0)
{
fscanf(f1,"%d",&num);
if(large<num)
{
large= num;
}
}
fclose(f1);
printf("Largest element = %d",large);
}
Content of number.txt
15 21 7 29 36 78 67 56 10
OUTPUT
Largest element = 78
IIPE 15
6) Consider you are a content writer in Wikipedia. You are the person who write the
known facts about APJ Abdul Kalam. After his death, you need to change all is to was.
Write a program to replace all is’ to was’ to a new file.
#include<stdio.h>
#include<string.h>
void main()
{
FILE *f1,*f2;
char str[30];
f1 = fopen("apj.txt","r");
f2 = fopen("new.txt","w");
fscanf(f1,"%s",str);
while(feof(f1) == 0)
{
if(strcmp(str,"is")==0)
fprintf(f2,"was");
else
fprintf(f2,"%s ",str);
fscanf(f1,"%s",str);
}
fclose(f1);
fclose(f2);
printf("Replaced String Successfully\n");
}
7) Write a program to reverse each content of file to another.
#include<stdio.h>
#include<string.h>
void main()
{
FILE *f1,*f2;
char str[30],rev[30];
int i,j;
f1 = fopen("test.txt","r");
f2 = fopen("new.txt","w");
while(feof(f1) == 0)
{
fscanf(f1,"%s",str);
j=0;
for(i=strlen(str)-1;i>=0;i--)
{
rev[j]=str[i];
j++;
}
IIPE 16
rev[j]='\0';
fprintf(f2,"%s ",rev);
}
fclose(f1);
fclose(f2);
}
Content of test.txt
Welcome to C programming
Content of new.txt after execution
emocleW ot C gnimmargorp
8) Write a program to count number of words and lines in a file.
#include<stdio.h>
#include<string.h>
void main()
{
FILE *f1,*f2;
int countW=0,countL=0;
char ch;
f1 = fopen("test.txt","r");
while (feof(f1) == 0 )
{
ch = fgetc(f1);
if(ch == ' ' || ch == '\t' || ch == '\n')
countW++;
if(ch == '\n')
countL++;
}
printf("Count of words = %d\n",countW);
printf("Count of Lines = %d",countL);
fclose(f1);
}
Content of test.txt
Welcome to C programming.
C is very easy to learn
OUTPUT
Count of words = 4
Count of Lines = 2
9) Write a program to append some data to already existing file.
IIPE 17
#include<stdio.h>
void main()
{
FILE *f1;
char str[30];
f1 = fopen("test.txt","a");
printf("Enter the string:");
gets(str);
fprintf(f1,"%s",str);
fclose(f1);
}
10) Write a program to display content of a file two times without closing the file.
#include<stdio.h>
void main()
{
FILE *fp;
char ch;
fp = fopen("test.txt","r");
while(feof(fp)==0)
{
ch=fgetc(fp);
printf("%c",ch);
}
rewind(fp);
while(feof(fp)==0)
{
ch=fgetc(fp);
printf("%c",ch);
}
fclose(fp);
}
OUTPUT
Hello, Welcome to C programming. Hello, Welcome to C programming.
11) Write a program to read the details of “n” Employees with following fields –
name, empid and salary and write the details into a file. Then read details from file
and display the name of employee who has highest salary.
#include<stdio.h>
struct Employee
{
char name[30];
int empid;
double salary;
IIPE 18
};
void main()
{
FILE *fp;
struct Employee e[10],res,temp;
int i,n;
fp = fopen("employee.dat","w");
printf("Enter the limit:");
scanf("%d",&n);
printf("Enter the details of Employee\n");
for(i=0;i<n;i++)
{
printf("Name:");
scanf("%s",e[i].name);
printf("EmpId:");
scanf("%d",&e[i].empid);
printf("Salary:");
scanf("%lf",&e[i].salary);
fwrite(&e[i],sizeof(e[i]),1,fp);
}
fclose(fp);
fp = fopen("employee.dat","r");
res.salary=-1.0;
while(feof(fp) == 0)
{
fread(&temp,sizeof(temp),1,fp);
if(res.salary < temp.salary)
{
res = temp;
}
}
printf("Name of Employee with highest Salary:%s",res.name);
}
OUTPUT
Enter the limit:2
Enter the details of Employee
Name:John
Salary:10000
Name:Kiran
EmpId:102
Salary:20000
Name of Employee with highest Salary:Kiran
IIPE 19
text