C与指针-第十五章--输入/输出

本章主要讨论ANSI C的输入和输出(I/O)函数。首先需要看两个错误和退出的函数。

错误报错perror:

原型:void perror(char const *message);
头文件: < stdio.h> , < stdlib.h>

如果message不是NULL,并且指向一个非空的字符串,perror函数就打印出这个字符串。

1
2
3
4
5
6
 FILE *fp;
fp = fopen(“/home/tianger/test”,”r”);
if(NULL == fp)
{
perror(“/home/tianger/test”);
}

输出:

/home/tianger/test:No such file or directory

终止执行exit:

原型:void exit(int status);
头文件: < stdlib.h>

exit,用于终止一个程序的执行,传入的status参数返回给操作系统,用于提示程序是否正常完成。

1
2
3
4
5
#include<stdlib.h>
int main()
{

exit ⑴;//等价于return ⑴;
}

打开流:fopen:

原型:FILE fopen(const char path,const char * mode);
返回值:成功,返回文件指针,失败返回NULL,错误码保存在errno中 .

1
2
3
4
5
6
FILE *fp;
fp = fopen(“/home/tianger/test”,”r”);
if(NULL == fp)
{
perror(“/home/tianger/test”);
}

关闭流:fclose:

原型:int fclose( FILE *fp );
返回值:成功,返回0;失败,返回EOF(-1)

关闭fopen打开的fp

fclose(fp);
fp = NULL;

读缓冲区:fread:

fread从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功或读到文件末尾返回 0

原型:size_t fread ( void buffer, size_t size, size_t count, FILE stream) ;
参数:
buffer 用于接收数据的内存地址
size 要读的每个数据项的字节数,单位是字节
count 要读count个数据项,每个数据项size个字节.
stream 输入流
返回值:实际读取的元素个数。如果返回值与count不相同,则可能文件结尾或发生错误。从ferror和feof获取错误信息或检测是否到达文件结尾。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
#include<string.h>
int main(void)
{

FILE*stream;
char msg[]="this is a test";
char buf[20];
if((stream=fopen("tianger.txt","w+"))==NULL)
{
fprintf(stderr,"Can not open output file.\n");
return 0;
}
/*write some data to the file*/
fwrite(msg,strlen(msg)+1,1,stream);
/*sizeof(char)=1 seek to the beginning of the file*/
fseek(stream,0,SEEK_SET);
/*read the data and display it*/
fread(buf,strlen(msg)+1,1,stream);
printf("%s\n",buf);
fclose(stream);
return 0;
}

输出:
产生一个tianger.txt文件,并打印 this is a test.

写缓冲区: fwrite:

fwrite 指向文件写入一个数据块.fwrite只是把程序先写到缓冲区,真正写入到文件,由操作系统决定,如果此时你想快速把缓冲区内容写入到文件,可以调用fflush()来实现。

原型:size_t fwrite(const void buffer, size_t size, size_t count, FILE stream);
返回值:返回实际写入的数据块数目

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main ()
{

FILE * pFile;
char buffer[] = { 'x' , 'y' , 'z' };
pFile = fopen ( "tianger.txt" , "wb" );
fwrite (buffer , sizeof(buffer), 1 , pFile );
fclose (pFile);
return 0;
}

输出:
往文件tianger.txt中写入xyz

移动文件流的读写位置:fseek()

原型:int fseek(FILE *stream, long offset, int fromwhere);
返回值:如果执行成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置,函数返回一个非0值。

示例参考fread中的用法。

缓冲区强制物理写入:fflush()

fflush()用来清除读写缓冲区,需要立即把输出缓冲区的数据进行物理写入。

原型:int fflush(FILE *stream);
返回值:成功,返回0;失败,返回EOF(-1)。

在上面fwite写完后,fflpsu(fp); 即执行缓冲区内容写入文件。

格式化字符:sprintf():

sprintf()是字符串格式化命令,主要功能是把格式化的数据写入某个字符串中,它是一个可变参数函数。

原型:int sprintf(char buffer,char const format, …)
参数:
buffer:char型指针,指向将要写入的字符串的缓冲区。
format:格式化字符串。
[argument]…:可选参数,可以是任何类型的数据。
返回值:
返回写入buffer 的字符数,出错则返回-1. 如果 buffer 或 format 是空指针,且不出错而继续,函数将返回-1,并且 errno 会被设置为 EINVAL。
sprintf 返回被写入buffer 的字节数,结束字符‘\0’不计入内。即,如果“Hello”被写入空间足够大的buffer后,函数sprintf 返回5。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main( void )
{

char buffer[200], s[] = "computer", c = 'l';
int i = 35, j;
float fp = 1.7320534f;
// 格式化并打印各种数据到buffer
j = sprintf( buffer, " String: %s\n", s );
j += sprintf( buffer + j, " Character: %c\n", c );
j += sprintf( buffer + j, " Integer: %d\n", i );
j += sprintf( buffer + j, " Real: %f\n", fp );
printf( "Output:\n%s\ncharacter count = %d\n",buffer,j );
}

输出:
Output:
String: computer
Character: l
Integer: 35
Real: 1.732053

character count = 74

Tianger Ge wechat
如果您喜欢这篇文章,欢迎扫一扫我的微信公众号!