C 语言中的 重定向

发布于 2024-06-03 04:40:38 字数 3826 浏览 17 评论 0

1.freopen

语法如下:

FILE </em>freopen(const char <em>filename, const char </em>mode, FILE <em>stream)

这个函数用来重定向输出的,如下例子:

int main(int argc, char </em>argv[]) {
    FILE <em>stream;
    printf("One\n");
    stream = freopen("out.txt", "a+", stdout);
    printf("Two\n");

    return 0;
}

运行之后打印 One, 将 Two 追加到 out.txt 文件中,具体可见:C library function - freopen()

2.管道符

  • > : 重定向标准输出
  • >> : 重定向输出,与 > 不同的是它追加内容,而 > 会清空内容后在写入
  • < : 重定向标准输入
  • >& : 将一个句柄的输出写入到另一个句柄的输入中。
  • <& : 从一个句柄读取输入并将其写入到另一个句柄输出中
  • | : 管道,连接一个进程的标准输出与另一个进程的标准输入(一个程序的输出转向另一个程序的输入)

下面简单的程序:

int main(int argc, char </em>argv[]) {
    char name[20];
    while (scanf("%19s", name) == 1) {
        printf("name:%s\n", name);
    }
    return 0;
}

有一个含有名字的文件 names.txt,内容如下:

Hello world
C/C++
Python
Java
JS
Objective-C

那么我们用 < 重定向输入:将 names.txt 文件作为输入源:

./main < names.txt
name:Hello
name:world
name:C/C++
name:Python
name:Java
name:JS
name:Objective-C

这里为什么 world 另起一行呢,原因就是在 scanf 语句的格式串中由于没有非格式字符,因此在输入时要用一个以上的空格或回车键作为每两个输入数之间的间隔。

> 重定向输出到 out.txt 文件中:

./main < names.txt > out.txt
./main < names.txt >> out.txt  // 追加

把 stdout 和 stderr 信息打印在一块:

./main < names.txt > out.txt 1>&2

3.fprintf() sends formatted output to a stream.

发送格式输出到数据流, 语法如下:

int fprintf(FILE <em>stream, const char </em>format, ...)
  • stream:FILE object 指针,标识该数据流的文件对象
  • format:格式化字符串: %[flags][width][.precision][length]specifier
fprintf(stderr, "err");        // 标准错误输出
fprintf(stdout, "good");    // 标准输出

一个简单的例子:

#include <stdio.h>
#include <stdlib.h>

// 读取文件
void readFile() {
    FILE <em> fp;
    char c;
    fp = fopen("file.txt", "r");
    while (1) {
        c = fgetc(fp);      // 读取一行
        if (feof(fp)) {     // EOF: 文件结尾
            break;
        }
        printf("%c", c);
    }
    fclose(fp);

}

// 写入文件
void writeFile() {
    FILE </em> fp;                      // 声明一个 FILE 类型的指针
    fp = fopen("file.txt", "w+");   // 以追加的方式打开文件
    // 格式化输出到文件流中
    fprintf(fp, "%s %s %s %d\n", "We", "are", "in", 2015);
    fprintf(stdout, "ok\n");

    // 一个进程最多有 256 个数据流,数据流有限,用完之后要关闭
    fclose(fp);
}

int main(int argc, char <em>argv[]) {
    writeFile();
    readFile();
    return 0;
}

到目前为止,用了 printf , fprintf , sprintf , 它三者区别如下:

  • printf outputs to the standard output stream ( stdout )
  • fprintf goes to a file handle ( FILE )
  • sprintf goes to a buffer you allocated. ( char )

参考:Difference between fprintf, printf and sprintf?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

岁月静好

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

内心激荡

文章 0 评论 0

JSmiles

文章 0 评论 0

左秋

文章 0 评论 0

迪街小绵羊

文章 0 评论 0

瞳孔里扚悲伤

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文