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

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

原创粉丝点击