【问题标题】:fprintf stdout isn't dumping data 100% accuratefprintf stdout 没有 100% 准确地转储数据
【发布时间】:2017-07-23 03:28:52
【问题描述】:

我一直在使用 IAudioCaptureClient 从我的音频输出设备收集数据并使用正在工作的 mmioWrite 将其记录到一个文件中,但我也想将此数据转储到 stdout,以便能够流式传输它。我正在使用 fprintf,但输出数据与写入的文件中的数据并不完全相同,即使它来自同一个缓冲区,这两个文件似乎 98% 相同。

以下是相关代码:

BYTE *pData;
...
// Here pData is bufferized with data from my output device
pAudioCaptureClient->GetBuffer(&pData, &nNumFramesToRead, &dwFlags, NULL, NULL);
...
LONG lBytesWritten = mmioWrite(hFile, reinterpret_cast<PCHAR>(pData), lBytesToWrite);

fprintf(stdout, "%.*s", lBytesWritten, pData);
...
// I've also tried

// HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

// WriteConsole(hStdOut, reinterpret_cast<PCHAR>(pData), lBytesWritten, NULL, NULL);

【问题讨论】:

  • printf * 采用 int,而不是 LONG
  • stdout 默认以文本模式打开,因此此流将在 Windows 中将 \n 转换为 \r\n。如果您的数据可能包含任意字节,您将不得不对此做一些事情,例如不使用stdout,或者以二进制模式重新打开
  • 可能是这样,以二进制模式重新打开stdin,我会搜索如何做到这一点
  • 我实际上误认为这两个文件都像 98%,实际上它们完全不同,并且 printf 错过了很多信息。这就像 printf 太慢并且无法继续使用 mmioWrite 所以我添加了 100 mili 的睡眠,但它没有解决问题,这不是多线程问题,因为它们在同一个线程上运行,所以文本不会从一个对另一个。 stdout 中的所有文本都包含在 mmioWrite 中,但不是其他的。
  • 哦,我添加了_setmode(_fileno(stdout), _O_BINARY); 来生成标准输出的二进制输出,但结果是一样的。

标签: c++ visual-c++ stdout


【解决方案1】:

你应该使用fwrite来写入二进制数据,你可以这样控制字节数:fwrite(pData, 1, lBytesWritten, stdout);

在您的示例中,fprintf 在第一个零终止符处停止打印数据(lBytesWritten 宽度在这里没有帮助,它只是控制填充)。如果没有零终止符,它会打印更多,可能会导致崩溃。

【讨论】:

    猜你喜欢
    • 2017-02-02
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多