C语言学习记录——오십사 文件操作(3)

目录

一、fgets与fputs——文本行输入出函数

两个函数也可以操作屏幕、键盘

二、fscanf与fprintf——格式化输入出函数

三、sscanf与sprintf——字符串输入出函数


一、fgets与fputs——文本行输入出函数

假设已经有文件test.txt,里面存放着bit  hello两行字符

fgets:char* fgets(char* string, int n, FILE* stream)  string是数据存储的位置,从文件(stream)中读取的信息放到string这个字符数组中,n表示最多读取多少个字符。

int main()
{
    char buf[1024] = { 0 };
    FILE* pf = fopen("test.txt", "r");
    if (pf == NULL)
    {
        return 0;
    }
    //读文件
    fgets(buf, 1024, pf);
    printf("%s\n", buf);
    fclose(pf);
    pf = NULL;
    return 0;
}

打印buf也可以不加\n,因为如果文件里有\n,那么也会被读取,所以会换行,如果没有,就不换行。

或者输出的话还可以看一个puts函数,int puts(const char* string),写一个字符串到stdout去。所以

fgets(buf, 1024, pf);
puts(buf);

puts函数会不管怎样,都会自动换行。

如果以“w”形式写,需要用到fputs函数   int fputs(const char* string, FILE* stream)

int main()
{
    FILE* pf = fopen("test.txt", "w");
    if (pf == NULL)
    {
        return 0;
    }
    //写文件
    fputs("hello", pf);
    fputs("world", pf);
    fclose(pf);
    pf = NULL;
    return 0;
}

无论原先文件存不存在,内容都有什么,都会创建一个文件,写入内容,并覆盖旧的。这里没写换行,所以打印出来也不换行。

两个函数也可以操作屏幕、键盘

int main()
{
    char buf[1024] = { 0 };
    fgets(buf, 1024, stdin);//从标准输入流读取,也就是键盘
    fputs(buf, stdout);//输出到标准输出流,屏幕
    return 0;
}

或者直接使用gets和puts

gets(buf);
puts(buf);

这两个默认就是从标准输入到标准输出。

二、fscanf与fprintf——格式化输入出函数

int fprintf (FILE* stream,  const char* format[argument])可针对stdout也可以针对指定的流

printf (const char* format[argument])针对stdout

struct S
{
    int n;
    float score;
    char arr[10];
};

int main()
{
    struct S s = { 100, 3.14f, "bit" };
    FILE* pf = fopen("test.txt", "w");
    if (pf == NULL)
    {
        return 0;
    }
    //格式化的形式写文件
    fprintf(pf, "%d %f %s", s.n, s.score, s.arr);
    fclose(pf);
    pf = NULL;
    return 0;
}

可以按照不同的格式来操作,那么反过来,向文件输入

int scanf (const char* format[argument]);

int fscanf(FILE* stream, const char* format[argument]);

所以和上面的一样,接下来是代码

struct S
{
    int n;
    float score;
    char arr[10];
};

int main()
{
    struct S s = { 0 };
    FILE* pf = fopen("test.txt", "r");
    if (pf == NULL)
    {
        return 0;
    }
    //格式化的形式输入文件
    fscanf(pf, "%d %f %s", &(s.n), &(s.score), s.arr);
    printf("%d %f %s\n", s.n, s.score, s.arr);
    fclose(pf);
    pf = NULL;
    return 0;
}

同样也可以适用于标准输入和标准输出

int main()
{
    struct S s = { 0 };
    fscanf(stdin, "%d %f %s", &(s.n), &(s.score), s.arr);
    fprintf(stdout, "%d %f %s\n", s.n, s.score, s.arr);
    return 0;
}

三、sscanf与sprintf——字符串输入出函数

对比函数

scanf/fscanf/sscanf

printf/fprintf/sprintf

scanf/printf:是针对标准输入流/标准输出流的格式化输入/输出语句

fscanf/fprintf: 是针对所有输入流/所有输出流的格式化输入/输出语句

sscanf/sprintf

sscanf:int sscanf(const char* buffer, const char* format[,argument]...);  从一个字符串里读取格式化的数据

sprintf: int sprintf(const char* buffer, const char* format[,argument]...);  往一个字符串里写一个格式化的数据

一个读字符串,一个写到字符串去

看代码

struct S
{
    int n;
    float score;
    char arr[10];
};

int main()
{
    struct S s = { 100, 3.14f, "abcdef" };
    struct S tmp = { 0 };
    char buf[1024] = { 0 };
    sprintf(buf, "%d %f %s", s.n, s.score, s.arr);
    sscanf(buf, "%d %f %s", &(tmp.n), &(tmp.score), tmp.arr);
    printf("%d %f %s\n", tmp.n, tmp.score, tmp.arr);
    return 0;
}

我们可以s这个结构体变量中的数据放到buf数组里,也可以把buf数组里的内容读取出来放到tmp中。

sscanf/sprintf:sscanf是从字符串中读取格式化的数据,sprintf是把格式化数据输出或(存储到)字符串

结束。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值