我之前一直在使用 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 我更高兴看到执行此处理的部分代码,而不是听到我可以确信这里一切都很好。
预先感谢您的任何提示。
对于作业,我应该创建两种方法:方法一将输入文件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) 我正在阅读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 新手,对不起,如果我的问题太基本了。我经常看到这样的代码:
printf("%d", counter);
fflush(stdout);
Run Code Online (Sandbox Code Playgroud)
我的猜测是,如果缓冲区未满,它将不会打印输出,因此您需要刷新stdout. 但是我试过不使用fflush,只是printf,我还把打印出来的东西印在屏幕上,那还有什么用flush呢?
在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) 我对 [K&R88] 深陷其中,并且受到责备,因为 K&R 用作示例和练习材料的gcc函数现已存在(据我所知,从 2010 年左右就开始存在)。getline()stdio.h
有什么办法可以告诉编译器像 1988 年一样播放它,并让我的朴素版本取代库中的版本吗?
\n(是的,这是徒劳的,但填充 [K&R88] 是我的新爱好;-)
\n强制编译器输出:
\ngcc -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.\nRun Code Online (Sandbox Code Playgroud)\n 我正在尝试使用 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) 出于什么目的,$ deferr,$ defout以及为什么没有$ defin,如果有$ stderr,$ stdout和$ stdin,还有STDIN,STDOUT和STDERR
改变其中任何一个都不会改变其他人
我有一个程序,它使用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 …
仅打印换行符更好(在性能和最佳实践中):
putchar('\n') 要么 puts("")
据我所知,putchar输出一个字符并puts输出一串字符.忘掉了printf.
我倾向于使用puts,因为它是短,但这样做("")只是感觉不对.
哪个更快更好?