一、引言
最近在准备面试的过程中,找到了一道难度不是很大的面试题,以此来进行文件操作相关函数以及用法的总结,面试题是这么讲的:
请编写程序:从键盘输入一个字符串,将其中的小写字母全部转化为大写在吗,输出到磁盘文件“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++都是必须要掌握的基础内容,再以后的学习中要多多的实践。