一道面试题引发的关于c语言中文件操作的总结

本文主要介绍了C语言中文件操作的常用函数,如getc()和putc(),分别用于读取和写入单个字符。这些函数不仅适用于标准输入输出,也可应用于任意文件,直到遇到文件结束标志EOF。文件操作是C语言基础且重要的知识点,需要通过实践不断巩固。
一、引言
最近在准备面试的过程中,找到了一道难度不是很大的面试题,以此来进行文件操作相关函数以及用法的总结,面试题是这么讲的:
请编写程序:从键盘输入一个字符串,将其中的小写字母全部转化为大写在吗,输出到磁盘文件“upper.txt"中保存。输入的字符串以”!“结束。然后,再将文件upper.txt中的内容读出显示在屏幕上。
初看此题觉得不是很难,写代码的时候发现自己久疏战阵,很多文件操作的用法有点生疏,下面我们来一一总结,搞清楚他们。

二、C语言文件操作的函数

1、getchar()
2、putchar()
3、getc()
4、putc()
5、gets()
6、puts()
7、getch()
8、putch()
7、fgetchar()
8、fputchar()
9、fgetc()
10、fputc()
11、fgets()
12、fputs()
13、fread()
14、fwrite()
15、fscanf()
16、fprintf()
三、函数的用法
我们分别来说明以上函数的用法,输入和输出成对的来说明
1、getchar和putchar()
getchar() 和putchar()函数作用于输入输出流,分别是等待输入流输入字符,以及输出流输出字符;
getchar():等待键盘输入字符,字符输入后并不立即返回,而是将字符放置于缓冲区中,等待换行符,遇到换行符后函数返回,一个字符一个字符从缓冲区中读取字符,直到从缓冲区读完所有字符。
putchar(int _Ch):该函数向输出流来输出一个字符。
oid get_putcharFun()
{
char ch;
ch = getchar();
while(ch != '!')
{
putchar(ch);
ch = getchar();
}


return ;
}

getc(FILE *file):如果是从标准输入读取字符则和getchar()没有任何的区别,函数形式为getc(stdin);
                 看函数形式,我们还可以从文件中读取字符,每次读取一个字符,知道文件末尾EOF字符,在此处并不是以换行符作为终止符,而是文件终止符;
putc(int _Ch, FILE *fp):如果是向标准输入读取字符则和putchar()没有任何的区别,函数形式为putc(ch,stdout);
                          看函数形式,我们还可以向文件写入字符,每次写入一个字符。

void get_putcFun()
{
	//标准输入输出的代码,和getchar,putchar函数没有区别
	/*char ch = getc(stdin);
	while (ch != '!')
	{
		putc(ch,stdout);
		ch = getc(stdin);
	}
	*/

	//测试文件输入输出时的用法
	char msg[] = "jkjkdjsaksksajksjksjclk%";
	FILE *fp = fopen("file.txt", "at+");
	if(fp == NULL)
	{
		printf("open falied\n");
		return;
	}
	char ch;
	while((ch = getc(fp)) != EOF)
	{
		putc(ch, stdout);
	}
	int len = strlen(msg);
	int i = 0;
	while(len > 0)
	{
		putc(msg[i],fp);
		len--;
		i++;
	}
	fclose(fp);
	return ;
}
3、getch()和putch()
这一对函数比较特殊,需要包含"conio.h"而不是"stdio.h"头文件,两个用法如下:
getch():给函数是等待标准键盘输入,每次输入一个字符后就立即返回,且不进行回显,即你在输入界面时看不到你正在输入的字符,
          这点和getchar以及getc(stdin)有区别主要是以下方面:
 * getchar()和getc(stdin)输入时要进行回显;
 * getchar()和getc(stdin)输入时并不是立即返回,等待换行符然后返回,getch()则是读入到一个字符后立即返回,并不是等待换行符的输入。
putch(int _Ch):该函数是向标准输出输入一个字符和putchar和puc(ch,stout)并没有什么区别。
void get_putchFun()
{
	char ch;
	while((ch = getch())!='!')
	{
		//putc(ch, stdout);
		putch(ch);
	}
	return;
	//getch();
}
4、gets()和puts()
gets函数时从标准输入读取一行,遇到换行符则返回,并且将换行符也读入到字符缓冲区里面;
puts()向标准输出输出一行数据,并且最后自动添加换行符。
void get_putsFun()
{
	char buffer[256] = {0};
	gets(buffer);
	puts(buffer);

}
5、fgetchar()和fputchar()
这两个函数哈getchar和putchar并没有任何区别,但是一般都是使用getchar和putchar进行操作;
void fget_fputcharFun()
{
	char ch;
	while((ch = fgetchar())!='!')
	//putc(ch, stdout);
	fputchar(ch);

	return;
}
6、fgetc和fputc
这两个函数其实就是getc和putc中的输入输出文件版本,例子如下:
void fget_fputcFun()
{
	char msg[] = {"uuuuuuuuuuuuuuuuuuuuuuuuuuuu"};
	FILE *fp = fopen("file.txt", "at+");
	if(fp == NULL)
	{
		return;
	}
	char ch;
	while((ch = fgetc(fp))!=EOF)
	{
		putc(ch, stdout);
	}
	int len = strlen(msg);
	int i = 0;
	while(len > 0)
	{
		putc(msg[i], fp);
		len--;
		i++;
	}
		fclose(fp);
	return;
}

七、fgets和fputs函数
fgets:从打开的文件中读取一行,放入到缓冲区;
fputs:向打开的文件写入一行数据。
代码如下:

oid fgets_fputsFun()
{
	char buffer[1024];
	char outBuffer[1024] = "OOOOOOOOOOOOOOOO";
	FILE *fp = fopen("file.txt","at+");
	if(fp == NULL)
	{
		return;
	}
	while(fgets(buffer, sizeof(buffer), fp) != NULL)
	{
		printf(buffer);
	}
	fputs(outBuffer,fp);
	fclose(fp);
	return;
}
八、fread函数和fwrite函数
fread():
从文件中读取字符放到缓冲区中,
原型为:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
        size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); 
返回值:读或写的记录数,成功时返回的记录数等于nmemb,出错或读到文件末尾时返回的记录
数小于nmemb,也可能返回0。
如下面代码进行测试
void fread_fwriteFun()
{
	char buffer[100] = {0};
	char writeBuffer[1024] = {"VVVVVVVVVVVVVVVVVVKKKZZZZZZZZZZZZZGGGGGGGGGGGGGSSz"};
	FILE *fp = fopen("file.txt", "r");
	if(fp == NULL)
	{
		return;
	}
	fseek(fp, 0, SEEK_END);
	int lengths = ftell(fp);
	fseek(fp,0,SEEK_SET);
	char *pBuffer = new char[lengths];
	int len = fread(pBuffer,1 , lengths, fp);
	pBuffer[len] = '\0';
	if(len)
	{
		printf(pBuffer);
		printf("FILE p offset:%d\n", (int)ftell(fp)); 
	}
	fclose(fp);

}
void fwrite_Fun()
{
	FILE *fp = fopen("file.txt", "a+");
	if(fp == NULL)
	{
		return;
	}
	char writeBuffer[1024] = {"VVVVVVVVVVVVVVVVVGGGVOPOPJHHHz"};
	fseek(fp, 0, SEEK_SET);
	int len = strlen(writeBuffer);
	int lengths = fwrite(writeBuffer, 1, len, fp);
	printf("FILE fp offset:%d\n", (int)ftell(fp));
	fseek(fp, 0, SEEK_SET);
		fclose(fp);
}


void printFun()
{
	FILE *fp = fopen("file.txt", "a+");
	if(fp == NULL)
	{
		return;
	}
		char ch;
		while((ch = getc(fp)) != EOF)
		{
			putc(ch, stdout);
		}
}
注意;在使用以上函数的时候要特别注意指针的是指向,以及指针的当前位置,否则很容易造成读写文件时候的造成乱码。
九、fscanf和fprintf函数
fscanf和fprintf函数主要是用来向文件进行格式输入输出的函数,函数原型如下:
int fscanf(FILE *stream, char *format,[argument...])
int fprintf( FILE *stream, const char *format, [argument...];

void fprintfFun()
{
	struct Test {
		int num;
		int last;
		double point;
		float extra;
	};
	struct TestStr {
		int num;
		int last;
		double point;
		char extra[16];
	};
	struct Test tset[4] = { { 12,33,90.2,88.7 },{ 15,44,99.6,34.8 },{ 20,55,89.9,67.5 },{ 44,66,88.4,44.5 } };
	struct TestStr tsetStr[4] = { { 12,33,90.2,"ssss" },{ 15,44,99.6,"dddd" },{ 20,55,89.9,"ffff" },{ 44,66,88.4,"hhhh" } };

	char buffer[1024] = { 0 };
	FILE *fp = fopen("test.txt", "at+");
	if (fp == NULL)
	{
		printf("open failed\n");
		return;
	}
	for (int i = 0; i < 4; i++)
	{
		//fprintf(fp, "%d,%d,%f,%f\n", tset[i].num, tset[i].last, tset[i].point, tset[i].extra);
		fprintf(fp, "%d,%d,%f,%s\n", tsetStr[i].num, tsetStr[i].last, tsetStr[i].point, tsetStr[i].extra);
	}
	fclose(fp);
}

void fscanfFun()
{
	FILE *fp = fopen("test.txt", "r");
	if (fp == NULL)
	{
		return;
	}
	//fseek(fp, 0L, SEEK_SET);
	int number = 0;
	float points = 0.0;
	float extras = 0.0;
	int last;
	char str[16] = {0};
	//while (fscanf(fp, "%d,%d,%f,%f\n", &number, &last, &points, &extras) == 4)
	//{
	//	printf("%d,%d,%f,%f\n", number, last, points, extras);
	//}
	while (fscanf(fp, "%d,%d,%f,%s\n", &number, &last, &points, &str) == 4)
	{
		printf("%d,%d,%f,%s\n", number, last, points, str);
	}
	fclose(fp);
}
十、总结

文件的操作不管是在c语言还是c++都是必须要掌握的基础内容,再以后的学习中要多多的实践。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值