基础I/O,也就是输入/输出。下面介绍一些常用的文件操作函数。
1. fopen( ) / fclose( )
这两个函数每次都是结伴出现,用fopen打开文件,用close关闭文件。
在结尾位置将文件关闭 fclose(fp);
#include<stdio.h>
#include<string.h>
int main()
{
FILE* fp=fopen("myfile","r");
if(!fp)
{
printf("fopen error!\n");
}
char buf[1024];
const char* msg="hello world!\n";
while(1)
{
size_t s=fread(buf,1,strlen(msg),fp);
if(s>0)
{
buf[s]=0;
printf("%s",buf);
}
if(feof(fp))
break;
}
fclose(fp);
return 0;
}
2. 输出函数
a. printf(“%s”,msg);
将字符串msg输出到显示器上
b. fprintf(stdout,msg);
将字符串msg输出到stdout
fprintf的原型是int fprintf(FILE* stream,const char*format ,[argument…]);
其实printf是对fprintf的另一层包含使用
printf(“%s”,str) <==> fprintf(stdout,”%s”,str)
c. sprintf( ) / snprintf( )
原型:
int sprintf(char* str , char* format[,argument,…]);
int snprintf(char* str , size_t size , char*format ,[argument,…]);
例:sprintf(s , “%d” , 123); //把整数123打印成一个字符串保存在s中。
#include<stdio.h>
#include<string.h>
int main()
{
const char*msg="hello bijing!\n";
fwrite(msg,strlen(msg),1,stdout);
printf("%s",msg);
char* ret="ni hao!\n";
fprintf(stdout,"hello fprintf\n");
fprintf(stdout,"%d\n",ret);
return 0;
}
3. 输入函数
a. scanf( )
例:scanf(“%d”,&a); 从输入获取一个整形数字赋值给a。
b. fscanf( )
原型:int fscanf(文件指针,格式字符串,输入列表)
例:fscanf(fp , “%d” , &a);
c. sscanf( )
原型:int sscnaf( const char* buffer , const char* format , [argument]…);
例:char buf[512];
sscanf(“12345”,”%s”,buf); //将12345以%s的形式存入buf中。
4. read( ) / fread( )
a. read
不带缓冲
原型:size_t read(int fd , void* buf , size_t count );
read用于从文件描述符对应的文件读取数据,调用成功返回读出的字节数;buf为读出数据的缓冲区,count为每次读取的字节数,出错返回-1,EOF返回0。
b. fread
带缓冲
原型:size_t fread(void* ptr , size_t szie , size_t number, FILE* stream);
例:char buf[1024];
size_t temp=fread(buf , 1 , 10 , p);
每次从p中读取10个字符存入buf中。
5.write( ) / fwrite( )
a. write
不带缓冲,系统调用
定义函数: ssize_t write (int fd, const void * buf, size_t count);
参数:
fd:要进行写操作的文件描述词。
buf:需要输出的缓冲区
count:最大输出字节计数
函数说明: write()会把参数buf 所指的内存写入count 个字节到参数fd 所指的文件内. 当然, 文件读写位置也会随之移动.
返回值:如果顺利write()会返回实际写入的字节数. 当有错误发生时则返回-1, 错误代码存入errno 中.
错误代码:
EINTR 此调用被信号所中断.
EAGAIN 当使用不可阻断I/O 时 (O_NONBLOCK), 若无数据可读取则返回此值.
EADF 参数fd 非有效的文件描述词, 或该文件已关闭.
b. fwrite
函数使用:
fwrite(buffer,size,count,fp);
说明:
(1)buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。
(2)size:要读写的字节数;
(3)count:要进行读写多少个size字节的数据项;
(4)fp:文件型指针。
6. open( )
打开文件操作使用系统调用函数open(),该函数的作用是建立一个文件描述符,其他的函数可以通过文件描述符对指定文件进行读取与写入的操作。打开文件的一般形式是:
open(文件路径, 标志);
(1)函数的返回值是文件描述符,如果打开文件成功返回一个正整数,否则返回-1。标志是用于指定打开文件操作模式的枚举常量,主标志如表
(2)主标志是互斥的,使用其中一种则不能再使用另外一种。除了主标志以外,还有副标志可与它们配合使用,副标志可同时使用多个,使用时在主标志和副标志之间加入按位与(|)运算符,打开文件操作的副标志如表
7. close( )
close函数关闭一个已打开的文件:
返回值:成功返回0,出错返回-1并设置errno
参数fd是要关闭的文件描述符。需要说明的是,当一个进程终止时,内核对该进程所有尚未关闭的文件描述符调用close关闭,所以即使用户程序不调用close,在终止时内核也会自动关闭它打开的所有文件。但是对于一个长年累月运行的程序(比如网络服务器),打开的文件描述符一定要记得关闭,否则随着打开的文件越来越多,会占用大量文件描述符和系统资源。
由open返回的文件描述符一定是该进程尚未使用的最小描述符。由于程序启动时自动打开文件描述符0、1、2,因此第一次调用open打开文件通常会返回描述符3,再调用open就会返回4。可以利用这一点在标准输入、标准输出或标准错误输出上打开一个新文件,实现重定向的功能。例如,首先调用close关闭文件描述符1,然后调用open打开一个常规文件,则一定会返回文件描述符1,这时候标准输出就不再是终端,而是一个常规文件了,再调用printf就不会打印到屏幕上,而是写到这个文件中了。
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
int main()
{
int fd=open("myfile",O_RDONLY);
if(fd<0)
{
perror("open");
return 1;
}
const char*msg="hello world!\n";
char buf[1024];
while(1)
{
ssize_t s=read(fd,buf,strlen(msg));
if(s>0)
printf("%s",buf);
else
break;
}
close(fd);
return 0;
}