How to read in a text file character by chararcter??

I have an assignment which requires me to read iin a text file character by character. I have managed to readin the file as a strin but not character by character. I am unsureof how to go about this. Im a beginner so any help in simple terms would be much appreciated.Heres my current code.

//Program to Read a users file anh print to the screen and then encrypt the file.
#include<stdio.h>
#include<stdlib.h>
void main()
{
//Stating variables.
FILE *file_in;
FILE *filepointer;

char sentence[50];
char fname[20];


//asking user for file name.
printf("please enter the file which you would like to open and encrypt\n");

scanf( "%s", fname);

file_in = fopen(fname, "r");

fscanf(file_in, "%s", sentence);
fprintf(file_in, "%s", sentence);

printf("%s\n", sentence);

//if the end of file is reached a message is entered.
if (feof(file_in))
printf("We have reached end-of-file\n");

fclose (file_in);
}
Hi

Ive just changed a little bit of code to read byte by byte.

Be aware of the max number of characters in sentence 50 & fname 20
as it is easy to overflow them.


1
2
3
4
5
6
7
8
9
10
11
12
        file_in = fopen(fname, "r");

	int	i=0;

	while	(!feof(file_in))
	{
		fscanf(file_in,"%c",&sentence[i]);
	
		i++;
	}

	printf("%s\n", sentence);


Hope this was Helpful
Shredded
thank you very much, that seems to have done the trick apart from when i print the sentence at the end, it has a load of gibberrish after it.
hi again

The giberish is because you need a NULL terminator at the end of the char string.

after the while loop and before printf add the following line

 
       sentence[i] = 0x00;


this should work
Shredded
Thank that did the trick. Now my assignment wants me to 'Your program should now ask the user for the name of the output file and to enter the alphabetic offset key, apply the encryption and write the cipher text to the output file.' The encryption needs to be a caeser cipher. hmmm i am confused. Cant seem to get my head around it.
hi,

I looked up caeser cipher and come up with a function like this.

you will also need to include <string.h> & <ctype.h>

You look like youve got a handle on doing the text input and file stuff so Ill leave
that to you.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void	encrypt(char key,char* input,char* output)
{
	char	work;

	key = toupper(key) - 0x41; //ascii code for 'A'
	
	for (int i=0;i<strlen(input);i++)
	{
		if (input[i] == 0x20)	//ascii code for space
		{
			output[i] = input[i];
			continue;
		}

		work = toupper(input[i]) + key;

		if (work > 0x5A)
		{
			work -= 26;		//wrap around back to A
		}

		output[i] = work;
	}

	output[strlen(input)+1] = 0x00;		//terminating character

	printf("%s",output);
}


note: Ive converted all characters to uppercase if this is not what you need please
post back and Ill try to fix it.

Hope this was what you were after
Shredded
Hi shredded, i found out today in a lab session that the cipher needs to be done by usng an array and then shifting the array. so i have made an array with the alphabet within the array. Now to create ceaser cipher supposedly all i need to do is shift the array between 1-25 spaces, as thats the alphabet before you do a full circle on your self. I then need to write the text from my file to a new file with the encryption enabled. This is my program up to now, aplogies if its complete randomness to you. Im trying to get my layout in a better state.

//Program to Read a users file and print to the screen and then encrypt the file.
#include<stdio.h>
#include<stdlib.h>
void main()
{
//Stating variables.
FILE *file_in;
FILE *file_out;
char sentence[100];
char fname[50];
int key;
char cipher [26] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
char *offset ;
char *encrypt;

offset + cipher = encrypt;

//asking user for file name.
printf("please enter the file which you would like to open and encrypt\n");

//scanning users input for the file name.
scanf( "%s", fname);

//opening file and getting each character from the text file.
file_in = fopen(fname, "r");

int	i=0;

//while statement to read character by character.
	while	(!feof(file_in))
	{
		fscanf(file_in,"%c",&sentence[i]);
	
		i++;
	}
	
	sentence[i] = 0x00;

//printing each character to the screen, one at a time.s
printf("%s\n", sentence);

//if the end of file is reached a message is entered.
if (feof(file_in))
printf("We have reached end-of-file\n");



//asking user for file name.
printf("please enter the file which you would like to write to and encrypt\n");

//scanning users input.
scanf( "%s", fname);

file_out = fopen(fname, "w");

printf("please enter the offset key");
scanf("%s", key);

if 
	(key >=1 && key <=25)
	printf( "encryption will now begin");
else 
	printf("please enter a valid key");
scanf("%s", key);



printf("%s", offset);


//close the file 
fclose(file_out);

//closes the open file.
fclose (file_in);
}
Hi have written a bit more code and this is what it come out as

the shiftArray function has been added to shift the array to use for encryption.

the key value has to be input as a integer (scanf("%d", &key) and we need the address
of key (&)

The for loop at the end does the encryption by taking 0x61 (ascii 'a') from the character
and then using the result to index the shifted array. Spaces remain unchanged.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
//Program to Read a users file and print to the screen and then encrypt the file.
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>

void	shiftArray(char* arrayIn,int key);

void main()
{
//Stating variables.
	FILE *file_in;
	FILE *file_out;
	char sentence[100];
	char fname[50];
	int  key;
						int	inLength;			// ADDED
	char cipher [26] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};


							//	char *offset ;	**not used 
							//	char *encrypt;

							//	offset + cipher = encrypt;   **unsure what you were doing here

	//asking user for file name.
	printf("please enter the file which you would like to open and encrypt\n");

	//scanning users input for the file name.
	scanf( "%s", fname);

	//opening file and getting each character from the text file.
	file_in = fopen(fname, "r");

	int	i=0;

	//while statement to read character by character.
	while	(!feof(file_in))
	{
		fscanf(file_in,"%c",&sentence[i]);
	
		i++;
	}
	
	sentence[i] = 0x00;

	inLength = i;

	//printing each character to the screen, one at a time.s
	printf("%s\n", sentence);

	//if the end of file is reached a message is entered.
	if (feof(file_in))
		printf("We have reached end-of-file\n");



	//asking user for file name.
	printf("please enter the file which you would like to write to and encrypt\n");

	//scanning users input.
	scanf( "%s", fname);

	file_out = fopen(fname, "w");

			printf("please enter the offset key");
			scanf("%d", &key);

			while (key < 1 && key > 25)
			{	
				printf("please enter a valid key");
				scanf("%d", &key);
			}

			shiftArray(cipher,key);
				
			printf( "encryption will now begin");

											//printf("%s", offset); not needed

			int	tempPos = 0;

			for (int i=0;i<inLength;i++)
			{
                                if (sentence[i] == ' ')
				{
					fprintf(file_out,"%c",' ');
					continue;
				}

		 		sentence[i] = tolower(sentence[i]);
				tempPos = sentence[i] - 0x61;

				fprintf(file_out,"%c",cipher[tempPos]);
			}


	//close the file 
	fclose(file_out);

	//closes the open file.
	fclose (file_in);
}

void	shiftArray(char* arrayIn,int key)
{
	char	tempArray[26];

	for (int i=key,j=0;i<26;i++,j++)
	{
		tempArray[j] = arrayIn[i];
	}

	for (int i=0,j=26-key;i<key;i++,j++)
	{
		tempArray[j] = arrayIn[i];
	}

	for (int i=0;i<26;i++)
	{
		arrayIn[i] = tempArray[i];
	}
}


Hope this was helpful
Shredded
Hi shredded, blimey you done it. im not sure i understand some of it though, could i highlight some areas i dont quite understand so i can get my head around it.

inLength = i;

what do all the 'i' means within the code?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int	tempPos = 0;

			for (int i=0;i<inLength;i++)
			{
                                if (sentence[i] == ' ')
				{
					fprintf(file_out,"%c",' ');
					continue;
				}

		 		sentence[i] = tolower(sentence[i]);
				tempPos = sentence[i] - 0x61;

				fprintf(file_out,"%c",cipher[tempPos]);
			}


What do the ' ' mean in relation to the sentence variable?
Also what does 'tolower' mean?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void	shiftArray(char* arrayIn,int key)
{
	char	tempArray[26];

	for (int i=key,j=0;i<26;i++,j++)
	{
		tempArray[j] = arrayIn[i];
	}

	for (int i=0,j=26-key;i<key;i++,j++)
	{
		tempArray[j] = arrayIn[i];
	}

	for (int i=0;i<26;i++)
	{
		arrayIn[i] = tempArray[i];
	}
}


Finally what does this mean at the bottom?

Thank you very much shredded, you have been really helpful.
hi

we have used 'i' as the counter when we have input the numbers from the file,
I just thought for clarity we would put this in the variable inLength for use later on.

the ' ' is just the space character that we dont want to modify so it writes it
directly to file without encrypting.

'tolower' converts the character to lower case may not need to use it but we would
then have to check for both upper and lower case values.

The for loops in shift array copy the shifted array values into a temp array,
you need two for loops to do this one for 'key -> z' and one for 'a -> key-1'
the third for loop simply copies the tempArray back into the input array.

Hope that this explains it
Shredded

Topic archived. No new replies allowed.