文件io 大汇总

 

文件打开 fopen   文件关闭  fclose

 字符输入(单个字符)

int  fgetc(FILE *stream);

int  getc(FILE *stream);   //宏

int  getchar(void);

#include <stdio.h>
int main(int argc, char **argv)
{
    FILE *fp;
    int rec;
    fp=fopen("1.txt","r+");
    if (fp==NULL)
    {
        perror("fopen");
        return 0;
    }
    // rec=fgetc(fp);
    // printf("Get char=%c\n", rec);

    int wrc='w';
    rec=fputc(wrc, fp);
    if(rec==-1)
    {
        perror("fputc");
        fclose(fp);
        return 0;
    }
    putchar(wrc);
    fclose(fp);
}

行输入(读取整个行

char *fgets(char *s, int size, FILE *stream);

#include <stdio.h>

int main(int argc, char **argv)
{
    char buff[100];
    char * ret;
    
    FILE *fp;
    fp=fopen("1.txt","r");
    if(fp==NULL)
    {
        perror("fopen");
        return 0;
    }
    //ret=fgets(buff,5,stdin);//从标准输入读取
    ret=fgets(buff,5,fp);//从文件读取
     if(ret==NULL)
     {
        perror("fgets");
        fclose(fp);
        return 0;
     }
     printf("buff=%s\n",buff);
     fclose(fp);
}

 注意    标准输入就是从键盘上输入

stdout 标准输出  就是从键盘上输出

行输出(写整行)

int  puts(const char *s);     没有说明输出位置  说明是stdout  输出到屏幕上

int fputs(const char *s,  FILE *stream);  输出到文件中  FILE *stream 设置为stdout输出到屏幕

流的定位:

long ftell(FILE *stream);

long fseek(FILE *stream, long offset,  int whence);

void rewind(FILE *stream);

fseek 参数whence参数:SEEK_SET/SEEK_CUR/SEEK_END

SEEK_SET 从距文件开头 offset 位移量为新的读写位置

SEEK_CUR:以目前的读写位置往后增加 offset 个位移量

SEEK_END:将读写位置指向文件尾后再增加 offset 个位移量

offset参数:偏移量,可正可负

标准IO练习

time()用来获取系统时间(秒数)

time_t time(time_t *seconds) 1970.1.1 0:0:0

localtime()将系统时间转换成本地时间

struct tm *localtime(const time_t *timer)

struct tm {

   int tm_sec;         /* 秒,范围从 0 到 59                */

   int tm_min;         /* 分,范围从 0 到 59                */

   int tm_hour;        /* 小时,范围从 0 到 23                */

   int tm_mday;        /* 一月中的第几天,范围从 1 到 31                    */

   int tm_mon;         /* 月份,范围从 0 到 11                */

   int tm_year;        /* 自 1900 起的年数                */

   int tm_wday;        /* 一周中的第几天,范围从 0 到 6                */

   int tm_yday;        /* 一年中的第几天,范围从 0 到 365                    */

   int tm_isdst;       /* 夏令时                        */    

};

二进制文件的读写

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <string.h>
int main(int argc, char **argv)
{
    int fd;
    int ret;
    char buf[32]="hello world";
    char buf2[100]={0};

    fd=open("test.txt",O_RDWR|O_CREAT|O_APPEND,0666);
    if (fd<0)
    {
        printf("open file error\n");
        return 0;
    }
    printf("successful.fd=%d\n",fd);
    ret=write(fd,buf,strlen(buf));
    if(ret<0)
    {
        perror("WRITE");
        goto END;
    }
    printf("write count=%d\n",ret);

    lseek(fd,0,SEEK_SET);//将指针移动到文件头部

    // close(fd);
    // fd=open("test.txt",O_RDWR|O_CREAT|O_APPEND,0666);
    ret=read(fd,buf2,100);
    printf("ret = %d\n",ret);
    if(ret<0)
    {
        perror("read");
        goto END;
    }
    buf2[99]=0;
    printf("read buf2=%s\n",buf2);

    END:
    close(fd);
    
}

注意!!!同一个文件编程 文件写完后 文件指针指向文件末尾,这个时候读 读不出内容 要 将指针移动到文件头部

 文件流的刷新和定位

注意printf 不加换行符不能打印 具体原因见连接

Linux下printf函数不加换行符就不能输出打印的内容_单片机printf不加回车无法打印_路痴的兔子的博客-CSDN博客

#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
    printf("abcdefg");
    fflush(stdout);//要有这个 刷新缓冲区
    while(1)
    {
        sleep(1);
    }
}

流的定位:

long ftell(FILE *stream);

long fseek(FILE *stream, long offset,  int whence);

void rewind(FILE *stream);

fseek 参数whence参数:SEEK_SET/SEEK_CUR/SEEK_END

SEEK_SET 从距文件开头 offset 位移量为新的读写位置

SEEK_CUR:以目前的读写位置往后增加 offset 个位移量

SEEK_END:将读写位置指向文件尾后再增加 offset 个位移量

offset参数:偏移量,可正可负

 

#include <stdio.h>

int main(int argc, char **argv)
{
    FILE *fp;
    fp=fopen("1.txt","w");
    if(fp==NULL)
    {
        perror("fopen");
        return 0;
    }
    fwrite("abcdef",6,1,fp);
    fseek(fp,-2,SEEK_CUR);//指针指向文件当前位置-2单位  相当于e   接着写入vvv 吧ef替换掉
    fwrite("vvv",3,1,fp);
}

输出abcdvvv

格式化输出和输入

格式化输出

sprintf 和fprintf

sprintf 输出到指定字符串

fprintf 输出到文件

格式化输入

fscanf

sscanf 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值