C printf 无法从终端按预期工作
C printf not working as expected from terminal
我已经尽可能地将问题简化为以下最小的代码片段。如果需要更多信息,请询问。
假设我有一个名为 A 的 Java 类,其主要方法是这样的:
public static void main (String args[])throws Exception{
Process p = new ProcessBuilder(args).redirectErrorStream(true).start();
Scanner in = new Scanner(new InputStreamReader(p.getInputStream()));
System.out.println(in.nextLine());
}
基本上,它从终端运行一个程序,从该程序读取一行,并回显它。很简单。
现在我有第二个用 c++ 编写的程序,如下所示:
int main()
{
string s;
cout << "example2 in c++"<<endl;;
cin >> s;
return 0;
}
当我调用:
java A pathToC++Program
程序按预期运行,输出从 CPP 程序发送的字符串并终止。
我在 c 中有一个等效的程序:
int main()
{
char s[10];
printf("example1 in cn");
fgets(s,10,stdin);
return 0;
}
当我调用:
java A pathToCprogram
程序停止,并且未打印任何内容。
当我从 c 程序中删除 fgets 行时,它看起来像这样:
int main()
{
printf("example1 in cn");
return 0;
}
然后Java程序能够识别该行并将其打印出来。因此,fgets 似乎是有问题的行,但是当包含 fgets 时,即使是之前的行也不起作用。
这是怎么回事?
(我不知道这是Java还是C的特点,所以我包含了这两个标签。
写入stdout
(这是printf
写入其输出的位置(默认是行缓冲的,这意味着缓冲区将在换行符上刷新。
但
这是直接从终端运行时的默认设置。如果输出不是终端,则stdout
将被完全缓冲,这意味着只有在填充缓冲区时才会刷新它。或显式fflush(stdout)
调用。
在 C++ 程序中,您可以使用std::endl
显式刷新输出(它写入换行符并刷新缓冲输出(。在 C 程序中,输出缓冲区没有这样的刷新。
这确实是非常特定于平台的,但对于POSIX平台(如Linux或macOS(,它就像上面描述的那样。我认为这与Windows非常相似。
至于为什么当你删除fgets
语句时它会起作用,可能是因为fgets
会阻止执行,直到读取文件末尾或某些(换行符终止的(输入。如果没有fgets
程序将在printf
后立即退出,这将导致stdout
缓冲区被刷新。
将std::endl
传递给std::cout
C++将刷新输出缓冲区。
若要刷新 C 中的输出缓冲区,应在printf
行后添加fflush(stdout);
。
- QSqlquery prepare()和bindvalue()不工作
- 如何在linux终端中同时编译和运行c++代码
- 导入库可以跨dll版本工作吗
- 终端不会为C++文件创建.exe文件吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- C printf 无法从终端按预期工作
- CUDA内核printf()在终端中不产生输出,在探查器中工作
- 从 eclipse IDE 运行工作正常,但在从终端运行时终止
- C++:在CodeBlocks上编译和运行的程序可以工作,但从终端它给出错误语句
- 命令在终端中工作,但不通过 QProcess
- 通过终端和编译创建项目文件失败,但通过Qt Creator IDE工作正常
- Cygwin终端GDB列表功能不工作
- 从终端编译框架(cppunit, boost, ++)以与Xcode 4.6一起工作
- 使用sublime-build时不能运行c++程序,从终端运行时工作正常
- 串行通信不通过QSerialPort (Qt)工作,但通过终端(白蚁)工作