C 文件操作

归纳 C 如何处理文件
文件 “stdio.h” 中定义了如下三个文件指针:
-stdin: 标准输入
-stdout: 标准输出
-stderr: 标准错误输出
它们对应的文件描述符分别是:0, 1, 2

其实 C++ Reference 对 stdio.h 的说明已经很详细了,但是输入输出并不是语言的部分,是操作系统的部分,下面会介绍这个特殊的部分。

freopen是用于文件重定向
dup和dup2是专门用于重定向的恢复

代码如下:(Linux 上可以运行)

#include <stdio.h>
#include <unistd.h>  // linux 上用这个文件
// #include <io.h>   // windows 上用这个文件

int main() {
    int c;
    char *filename= "out.txt";
    int old_f;
    FILE *f;

    f = fopen(filename, "w");
    fputs("hello world!\n\thello world!", f);
    fclose(f);

    old_f = dup(0);   // 0 表示标准输入流的文件描述符
    freopen(filename, "r", stdin);  // stdin 表示标准输入的文件指针
    while ((c = getchar()) != EOF) {
        putchar(c);
    }
    fclose(stdin);
    dup2(old_f, 0);  // 恢复标准输入文件描述符

    return 0;
}

fread和fwrite是专门针对块数据的
代码如下:(下面这个不能用不同的平台,原因是字节对齐的方式可能不一样)

#include <stdio.h>
#include <string.h>

struct OBJ {
    int a;
    double b;
    char s[BUFSIZ];
    int ar[10];
};

int main() {
    char *filename = "out.txt";
    FILE *f = NULL;
    OBJ obj;
    OBJ obj2;
    memset(&obj, 0, sizeof(OBJ));
    memset(&obj2, 0, sizeof(OBJ));

    obj.a = 10;
    obj.b = 20;
    strcpy(obj.s, "hello world!");
    obj.ar[5] = 5;

    f = fopen(filename, "rw");
    fwrite(&obj, sizeof(OBJ), 1, f);
    rewind(f);
    fread(&obj2, sizeof(OBJ), 1, f);
    fclose(f);

    printf("obj2.a = %d\n", obj2.a);
    printf("obj2.b = %lf\n", obj2.b);
    printf("obj2.s = %s\n", obj2.s);
    printf("obj2.ar[5] = %d\n", obj2.ar[5]);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值