Linux文件--文件操作

一、关于文件定位问题

1、重新定位文件指针流 --fseek

        可以用手册查看使用 man 3 fseek

头文件
    #include <stdio.h>
函数原型
    int fseek(FILE *stream, long offset, int whence);
函数作用:
        重置文件光标的位置
函数参数:
        stream--->你要设置哪个文件的文件光标,将这个文件的文件指针传递进来
        offset--->基于 基准点的偏移量
        
        whence---> 参考位置
                SEEK_SET  设置到文件开头
                SEEK_CUR  设置到文件当前位置
                SEEK_END  设置到文件尾部
返回值:
        成功返回 0
        失败返回 -1
    
注意:lseek和fseek的返回值不一样,fseek不能用返回值来得到文件的大小


2、获取当前偏移量距离开头的字节数。 man 3 ftell


头文件
    #include <stdio.h>
函数原型
    long ftell(FILE *stream);
函数作用:
        获取当前偏移量距离开头的字节数
函数参数:
        stream 文件指针
返回值: 
        成功返回 距离文件开头的字节数
        失败返回 -1

3、重置文件指针。 man 3 rewind

作用:rewind函数把文件流的读写位置(光标位置)偏移到开头。
    
    void rewind(FILE *stream);
        
函数参数:        
        stream 文件指针

相当于调用: fseek(fp,0,SEEK_SET);


4、feof

头文件 
    #include <stdio.h> 
定义函数 
    int feof(FILE * stream);

函数作用
    feof()用来侦测是否读取到了文件尾, 
参数
    stream 文件指针
    
返回值 
    如果当前文件流在文件尾(也就是读完了),返回 非零值
    如果当前文件没有读完,返回  0
    如果读一个空文件时,会把EOF当做读取成功,所以要用getch();之后再判断
5、ferror

头文件 
    #include <stdio.h> 
定义函数 
    int ferror(FILE *stream);
函数作用
    判断文件是否出错了
返回值 
    如果有错误发生  则返回非 0 值
    没有错误  返回 0
    
    
二、fprintf输出函数

#include <stdio.h>
int fprintf(FILE *stream, const char *format, ...);

函数作用: 
        将指定的格式化字符串数据 输出到指定的文件stream中

    
例子1:

将指定的数据输出到标准输出设备(屏幕)

    char *str = "hello";
    
    fprintf(stdout,"%s",str);

例子2:

    #include<stdio.h>

//要求:将一个人的信息保存(写入)到文本中

int main()
{
    char *name = "gebi";
    int age = 20;
    char *sex = "man";
    
    //1、打开文件
    FILE* fp = fopen("./info.txt","wb+");
    if(fp == NULL)
    {
        printf("fopen info.txt error\n");
        return -1;
    }
    //将指定格式的数据 输出到指定的文件中
    fprintf(fp,"name:%s  age:%d  sex:%s\n",name,age,sex);
    
    
    fclose(fp);
    return 0;
}

三、fscanf函数 

#include <stdio.h>
int fscanf(FILE *stream, const char *format, ...);

函数作用:从指定的文件stream 获取 指定格式的数据

例子1:从键盘上获取指定格式的数据

fscanf(stdin,"%s %d %s",name,&age,sex);


例子2: 

#include<stdio.h>

//要求:从一个文本中 按照 指定的格式 读取 数据

int main()
{
    char name[256]={0};
    int age;
    char sex[20]={0};
    

    //1、打开文件
    FILE* fp = fopen("./info.txt","rb+");
    if(fp == NULL)
    {
        printf("fopen info.txt error\n");
        return -1;
    }
    //以指定的格式从文本fp中获取数据,存储到变量对应的内存空间上
    fscanf(fp,"name:%s age:%d sex:%s",name,&age,sex);
    
    
    printf("name:%s age:%d sex:%s\n",name,age,sex);
    
    fclose(fp);
    return 0;
}

注意:fprintf以什么格式写入到文本中,fscanf就要以什么格式获取数据


练习1:定义一个学生结构体,从键盘上获取5个同学的信息,保存到文本中。

练习2:从文本中 获取 到学生的信息,并且全部显示出来。


四、标准IO其他接口函数

标准IO特殊函数。
sprintf()  getchar()  getc()  fgetc() putchar() putc()  fputc()  puts()  gets()  fgets()

1、sprintf()  -> 保存一个字符串,拼接字符串。

头文件:#include <stdio.h>
函数原型: int sprintf(char *str, const char *format, ...);

参数:
    str:数据缓冲区
    format:字符串格式

 返回值: 字符串总字符个数。

#include<stdio.h>

int main()
{
    char *name = "何永成";
    int age = 18;
    char *sex = "男";
    char *city = "广东湛江";
    
    char buf[1024]={0};
    //将上面三个数据 拼接在一起,保存到数组中
    sprintf(buf,"我的名字是:%s 来自:%s 今年芳龄:%d 性别:%s",name,city,age,sex);
    
    printf("%s\n",buf);
    
    return 0;
}

2、getchar()  -> 从标准输入缓冲区获取一个字符。  -> man 3 getchar  (用于清空stdin缓冲区)
头文件:#include <stdio.h>
函数原型: int getchar(void);
参数:无
返回值:
    成功: 获取到的字符
    失败: EOF


#include <stdio.h>

int main(int argc,char *argv[])
{
    int a;
    char b;
    scanf("%d",&a);  -> 65 + 回车  -> 65就会放置到a变量中
    
    //把缓冲区的数据清空掉。
    //getchar(); //把\n吃掉
    //while(getchar()!='\n');

    scanf("%c",&b);  -> 回车就会放置到b变量。
    
    printf("a = %d\n",a);
    printf("a = %c\n",a);
    printf("b = %d\n",b);
    printf("b = %c\n",b);
    
    return 0;
}

3、getc()  -> 从文件指针中获取一个字符  -> man 3 getc
头文件:#include <stdio.h>
函数原型: int getc(FILE *stream);

    stream:需要获取字符的文件的文件指针。

返回值:
    成功:获取到的字符
    失败:EOF

 getchar()  -> 固定从标准输入中获取。
 
 getc()  -> 既可以从标准输入中获取,也可以从文件中获取。

3、 fgetc()  -> -> 从文件指针中获取一个字符  -> man 3 fgetc

    int fgetc(FILE *stream);

  等价于 getc()


4、 putchar()  -> man 3 putchar  -> 将一个字符输出到屏幕终端上
原型:int putchar(int c);

参数:c: 需要输出的字符
返回值:
    成功:输出的字符
    失败:EOF

#include <stdio.h>
int main(int argc,char *argv[])
{
    char a = 'x';
    int b;
    b = putchar(a);
    printf("b = %d\n",b);
    printf("b = %c\n",b);
    
    return 0;
}

5、putc()  -> man 3 putc   -> 将一个字符搞到一个文件中

   putc 等价于 fputc

原型:int fputc(int c, FILE *stream);
      int putc(int c, FILE *stream);

参数: c: 需要处理的那个字符
      stream: 文件指针

返回值:
    成功:输出的字符
    失败:EOF

   练习6: 使用getc与putc完成文件拷贝。

6、puts()  -> 将一个字符串输出到屏幕。   -> puts(s) 等价于 printf("%s\n",s);

   int puts(const char *s);                 -> 只能是标准输出
  
 s: 需要处理的字符串

返回值:
    成功: 非负整数   字符个数+\n
    失败: EOF

注意:puts输出 自带换行符 \n
    
    
7、 fputs()  -> 将一个字符串输出到文件。

  int fputs(const char *s, FILE *stream);  -> 既可以是标准输出,也可以是一个文件

 s: 需要处理的字符串
 stream:文件指针

返回值:
    成功: 非负整数  1
    失败: EOF

比如:
#include<stdio.h>

int main()
{
    //输出一个字符串到屏幕终端上
    //fputs("hello world",stdout);
    
    
    FILE *fp = fopen("./1.txt","wb");
    if(fp == NULL)
    {
        printf("fopen error\n");
        return -1;
    }
    //输出一个字符串到指定的文件中
    fputs("hello world\n",fp);
    
    fclose(fp);
    
    return 0;
}

    
    
8、fgets() -> 从文件指针中获取一个字符串,包含'\n'。  -> man 3 fgets

  原型:char *fgets(char *s, int size, FILE *stream);
  参数: 
    s: 数据缓冲区
    size: 获取的大小
    stream: 文件指针

  返回值:
    成功: 返回s的值。
    失败: NULL

注意: 
函数说明 fgets()用来从参数 stream 所指的文件内读入字符并存到参数 s 所指的内存空间, 直到出现换行字符、
读到文件尾或是已读了 size-1 个字符为止, 最后会加上 NULL 作为字符串结束.    
    
int main(int argc,char *argv[])
{
    char buf[100] = {0};
    fgets(buf,100,stdin);
    printf("buf:%s",buf);
    
    return 0;
}

9、gets-->从键盘上获取 字符串

char *gets(char *s);

参数: s-->获取的字符串存储到这里

注意: 建议不要使用此函数,因为很容易 会造成 缓冲区 溢出的安全问题。使用 fgets代替
    
    
    
总结:

1、经常使用的标准IO接口:
    printf sprintf fprintf scanf fscanf getchar putchar 
2、要学会瞎折腾,多动手,自然会熟记于心

 无他,唯有手熟尔。

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值