c语言中文件读写面试题,一道面试题引发的关于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++都是必须要掌握的基础内容,再以后的学习中要多多的实践。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值