从文件中读取并在一行中写入 cout

Posted

技术标签:

【中文标题】从文件中读取并在一行中写入 cout【英文标题】:Read from file and write to cout in one line 【发布时间】:2018-12-15 16:02:44 【问题描述】:

有什么方法可以在一行中执行这两个操作:

fscanf(fp,"%d",&n);
std::cout<<n<<std::endl;

即,我正在寻找类似:std::cout&lt;&lt;fscanf(fp,"%d",&amp;n);&lt;&lt;std::endl;

显然&amp;n 必须被替换。不过必须使用FILE*

【问题讨论】:

如果您将代码更改为使用std::istream 而不是FILE*,您可以使用cout &lt;&lt; in.rdbuf() IIRC 为什么一定要一行? @Galik 公平点。代码高尔夫?编译器最终发出的可能与 inline 变体 完全相同。 @πάνταῥεῖ 当然,在硬盘上保存宝贵的字节可能很重要。源代码中的所有这些行尾加起来! ;-) @Galik 当您想在以某种方式操作后输出 T 时,我更强调如何将不遵循签名 ostream&amp; foo(ostream &amp;, T&amp;) 的函数注入更大的输出格式序列。此类代码的可读性很重要。 【参考方案1】:

是的,可以使用 , 运算符内联调用 fscanf()

#include <iostream>

int main()

    int n = 0;
    std::cout<< (fscanf(stdin,"%d",&n),n)<<std::endl;

观看现场演示here。


对于目前的示例,没有很多好的用例,但我认为至少有一个这样可以节省格式的可读性:

假设你有一个 T 类型,提供类似 void T::update(); 的操作,而你懒得将对 T::update() 的调用包装成类似 std::ostream&amp; update(ostream&amp;,T&amp;) 的东西,你可以使用这个技巧:

std::array<std::array<T,4>,4> m  // A matrix of T
     T::create() ,T::create() ,T::create() ,T::create()  ,
     T::create() ,T::create() ,T::create() ,T::create()  ,
     T::create() ,T::create() ,T::create() ,T::create()  ,
     T::create() ,T::create() ,T::create() ,T::create() 
;

// ....

using u = T::update;
std::cout << "Current matrix state:\n" <<
(m[0][0].u(),m[0][0]) << ',' (m[0][1].u(),m[0][1]) << ',' (m[0][2].u(),m[0][2]) << ',' (m[0][3].u(),m[0][3]) << '\n' <<
(m[1][0].u(),m[1][0]) << ',' (m[1][1].u(),m[1][1]) << ',' (m[1][2].u(),m[1][2]) << ',' (m[1][3].u(),m[1][3]) << '\n' <<
(m[2][0].u(),m[2][0]) << ',' (m[2][1].u(),m[2][1]) << ',' (m[2][2].u(),m[2][2]) << ',' (m[2][3].u(),m[2][3]) << '\n' <<
(m[3][0].u(),m[3][0]) << ',' (m[3][1].u(),m[3][1]) << ',' (m[3][2].u(),m[3][2]) << ',' (m[3][3].u(),m[3][3]) << '\n' <<
flush;

【讨论】:

以上是关于从文件中读取并在一行中写入 cout的主要内容,如果未能解决你的问题,请参考以下文章

如何从 servlet-filter 写入文件并在 Eclipse 中读取它?

infos

PHP如何把数据写入JSON文件并在另一PHP文件读取JSON数据?

从文件中读取大内容并将该内容写入新文件

GCP Dataflow- 从存储中读取 CSV 文件并写入 BigQuery

如何从文件中读取数据并在 QT 的 QEditText 框中显示