标签: stdio

C freopen 描述符 - 手动关闭/保持打开状态

我之前一直在使用 freopen (来自 stdio.h)函数,但没有问自己这个问题。但现在我不确定。

例如我重新打开了标准输出:

    #define  OUTPUT_FILE "out.txt"
    if ( freopen(OUTPUT_FILE,"w+",stdout) == NULL)
      printf("logout can't be opened\n");
Run Code Online (Sandbox Code Playgroud)

通常每个进程都有并自动处理 stdout、stderr、stdin,我们不需要关心它们的关闭。
但在这里怎么样?我已重新打开标准输出。
我应该调用 fclose 来关闭重新打开的标准输出吗?

PS 我更高兴看到执行此处理的部分代码,而不是听到我可以确信这里一切都很好。

预先感谢您的任何提示。

c file-descriptor stdio

2
推荐指数
1
解决办法
882
查看次数

如何在C中使用读取和写入过去的BUFSIZ

对于作业,我应该创建两种方法:方法一将输入文件read()转换write()为空输出文件,一次一个字节(缓慢)。

另一种方法将使用char buf[BUFSIZ];where BUFSIZis from <stdio.h>。我们应该这样做read(),并且write()这样做BUFSIZ会让事情变得更快。

我们测试每个方法的输入文件只是一个 Linux 字典 ( /dict/linux.words)。

我已经正确实现了方法一,我一次调用一个字符,将输入文件复制到输出文件read()write()虽然速度很慢,但至少把所有东西都复制过来了。

我的代码如下所示:

// assume we have a valid, opened fd_in and fd_out file.
char buf;
while(read(fd_in, buf, 1) != 0)
    write(fd_out, buf, 1);
Run Code Online (Sandbox Code Playgroud)

然而,对于方法二,当我使用 时BUFSIZ,我无法将每个条目传输到输出文件中。它在条目中失败z,并且不再写入。

所以,我的第一次尝试:

// assume we have a valid, opened fd_in and fd_out file
char buf[BUFSIZ];
while(read(fd_in, buf, BUFSIZ) != 0)
    write(fd_out, buf, …
Run Code Online (Sandbox Code Playgroud)

c linux system file stdio

2
推荐指数
1
解决办法
4517
查看次数

C++ - 为什么 fflush(stdout) 不能与 iostream 一起使用?

我正在阅读freopen()并意识到,如果我们为其指定 stdin/stdout,即使我们使用 cin/cout 进行编码,该函数也将起作用。

研究了一下,我发现这个链接 freopen() 相当于 c++streams,其中一位用户回答:

来自 C++ 标准 27.3.1:
“该对象cin控制来自与该对象关联的流缓冲区的输入stdin,在 中声明<cstdio>。”

所以根据标准,如果我们重定向stdin它也会重定向cin。反之亦然cout

在 CPPReference 上也看到了类似的内容:
http://en.cppreference.com/w/cpp/io/cin
http://en.cppreference.com/w/cpp/io/cout

全局对象 std::cout 和 std::wcout 控制输出到实现定义类型(派生自 std::streambuf)的流缓冲区,与标准 C 输出流 stdout 关联。

这就是有点令人困惑的地方,因为我也在阅读有关刷新的内容,并注意到 fflush(stdout) 根本无法与 cin/cout 一起使用。

例如,此示例代码不会打印任何内容:

#include <cstdio>
#include <iostream>

using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int n;
    cout << "Please, enter a number: \n";
    fflush(stdout);
    cin >> n;
}
Run Code Online (Sandbox Code Playgroud)

下面的代码将打印到output.txt:

#include <cstdio> …
Run Code Online (Sandbox Code Playgroud)

c++ iostream stdio fflush

2
推荐指数
1
解决办法
4584
查看次数

当 printf 可以自行打印时,为什么在 printf 之后使用 fflush?

我是 C 新手,对不起,如果我的问题太基本了。我经常看到这样的代码:

printf("%d", counter);
fflush(stdout);
Run Code Online (Sandbox Code Playgroud)

我的猜测是,如果缓冲区未满,它将不会打印输出,因此您需要刷新stdout. 但是我试过不使用fflush,只是printf,我还把打印出来的东西印在屏幕上,那还有什么用flush呢?

c flush stdio fflush

2
推荐指数
1
解决办法
357
查看次数

“现在节省 38%”C 字符串中止程序

TL; 博士

在C字符串"% n"用空格之间'%''n'字符(如在“保存现在38%”的字符串)被视为"%n",这被认为是因为最新的OS版本中的漏洞,并导致中止程序。

(请参阅 UPD 1 和 UPD 2)

背景

我正在调查我的应用程序中的登录问题。该应用程序从服务器接收一些字符串,我们使用类似于NSLog. 我们称该函数的格式为:

MyLog(@"%@", message);
Run Code Online (Sandbox Code Playgroud)

在一种情况下,消息包含文本“现在节省 38%”。此时应用程序崩溃。

问题

在调查时,我能够查明问题所在。完整代码如下。

#define FOO(FORMAT, ...) (\
{\
char *str;\
str = [[NSString stringWithFormat:FORMAT, ##VA_ARGS] UTF8String];\
str;\
}\
)\

#import "MyClass.h"

@implementation MyClass

- (instancetype)init
{
    self = [super init];
    if (self) {
        char *foo = FOO(@"%@", @"Save 38% now");
        printf(foo);
    }
    return self;
}

@end
Run Code Online (Sandbox Code Playgroud)

在任何地方实例化类,

MyClass *my = [[MyClass alloc] …
Run Code Online (Sandbox Code Playgroud)

c freebsd objective-c stdio char

2
推荐指数
1
解决办法
96
查看次数

stdio.h 中的函数 getline() 可以与 K&amp;R88 中的函数共存吗?

我对 [K&R88] 深陷其中,并且受到责备,因为 K&R 用作示例和练习材料的gcc函数现已存在(据我所知,从 2010 年左右就开始存在)。getline()stdio.h

\n

有什么办法可以告诉编译器像 1988 年一样播放它,并让我的朴素版本取代库中的版本吗?

\n

(是的,这是徒劳的,但填充 [K&R88] 是我的新爱好;-)

\n

强制编译器输出:

\n
gcc -g -Wall -o "pgm" "pgm.c" (in directory: /home/eric/Development/6.087)\npgm.c:9:7: error: conflicting types for \xe2\x80\x98getline\xe2\x80\x99\n    9 | char *getline(){\n      |       ^~~~~~~\nIn file included from pgm.c:1:\n/usr/include/stdio.h:616:18: note: previous declaration of \xe2\x80\x98getline\xe2\x80\x99 was here\n  616 | extern __ssize_t getline (char **__restrict __lineptr,\n      |                  ^~~~~~~\nCompilation failed.\n
Run Code Online (Sandbox Code Playgroud)\n

c stdio kernighan-and-ritchie

2
推荐指数
1
解决办法
120
查看次数

NodeJS child_process:指定 stdio 时未触发关闭事件:“继承”

我正在尝试使用 NodeJS 在 shell 中执行一些命令。因此我使用该node:child_process模块。

我使用该spawn函数是为了能够将子进程的输出转发到主进程的控制台。为了保持子进程输出的格式,我传递了该选项stdio: "inherit"(如本问题所述:在执行 child_process.spawn 时保留颜色)。

但如果我添加此选项,子进程事件(退出、断开连接、关闭……)将不再起作用。如果我删除该选项,我会丢失格式,但事件会起作用。有没有办法在子进程关闭时保留格式并得到通知?

(相关)代码:

const { spawn } = require("node:child_process");

let child = spawn("yarn", args, {
  stdio: "inherit",
  shell: true,
});
child.on("close", (code) => {
  console.log(`child process exited with code ${code}`);
});
Run Code Online (Sandbox Code Playgroud)

stdio child-process node.js

2
推荐指数
1
解决办法
1451
查看次数

出于什么目的,有$ deferr,$ defout以及为什么没有$ defin

出于什么目的,$ deferr,$ defout以及为什么没有$ defin,如果有$ stderr,$ stdout和$ stdin,还有STDIN,STDOUT和STDERR

改变其中任何一个都不会改变其他人

ruby stdio

1
推荐指数
1
解决办法
208
查看次数

`fwrite`在`fread`之后不能直接工作?

我有一个程序,它使用stdio来读取和写入二进制文件.它缓存当前流的位置,并且不会寻找读/写偏移是否已经在所需位置.

但是,出现了一个有趣的问题,即当读取一个字节并写入后面的字节时,它实际上并没有被写入!

这是一个重现问题的程序:

#include <cstdio>

int main() {
    FILE *f = fopen("test.bin", "wb");
    unsigned char d[1024] = { 0 };
    fwrite(d, 1, 1024, f);
    fclose(f);
    f = fopen("test.bin", "rb+");
    for (size_t i = 0; i < 1024; i++) {
        unsigned char a[1] = { 255 - (unsigned char)(i) };
        fflush(f);
        fwrite(a, 1, 1, f);
        fflush(f);
        fseek(f, i, SEEK_SET);
        fread(a, 1, 1, f);
        printf("%02X ", a[0]);
    }
    fclose(f);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

你应该看到它写字节FF下来00,但只有第一个字节写入,因为它不遵循fread马上.

如果它以前寻求fwrite …

c++ windows file-io stdio

1
推荐指数
1
解决办法
1029
查看次数

put或putchar更适合打印换行吗?

打印换行符更好(在性能和最佳实践中):

putchar('\n') 要么 puts("")

据我所知,putchar输出一个字符并puts输出一串字符.忘掉了printf.

我倾向于使用puts,因为它是短,但这样做("")只是感觉不对.

哪个更快更好?

c newline stdio

1
推荐指数
2
解决办法
332
查看次数