基础I/O

基础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;

}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值