【问题标题】:Write formatted text to file - C++将格式化的文本写入文件 - C++
【发布时间】:2016-07-15 14:08:25
【问题描述】:

我有这个代码:

        printf("GPU: %ic  SYSTEM: %ic  CPU: %ic  HDD: %ic  ",temp[0],temp[1],temp[2],temp[7]);
        ofstream temp_file;
        temp_file.open("D:\\localhost\\xampp\\htdocs\\monitor\\temps.json");
        temp_file << fprintf("\"{\"GPU\": [%ic], \"System\": [%ic], \"CPU\": [%ic], \"HDD\": [%ic]}\"", temp[0],temp[1],temp[2],temp[7]);
        temp_file.flush();
        temp_file.close();

我收到错误“无法将 'const char*' 转换为 'FILE* {aka _iobuf*}' for argument '1' to 'int fprintf(FILE*, const char*, ...)'

temp 变量是一个 int,并且代码的第一行确实成功地打印出格式化的文本。如何将该文本推送到文件中?

【问题讨论】:

  • 如果FILE*fopen() 易于使用,为什么不使用它们?
  • 你想用的可能是snprintf()
  • 检查 fprintf 采用的参数。与您的代码进行比较。再次阅读错误信息。此外,请避免使用像 printf 这样的遗留 C 函数,因为它们不是类型安全的,而且很容易创建未定义的行为错误。只需使用 C++ 流。
  • 重新分级错误很明显-您确实调用fprintf(),第一个参数是const char*,而不是代码第四行中的FILE* - fprintf("\"{\"GPU...。关于您的第二个问题“我如何将该文本推送到文件” - 使用您的ofstream temp_file,但阅读文档和示例如何使用 stl 流。是我否决了这个问题

标签: c++ io


【解决方案1】:

你在滥用fprintf()

fprintf() 返回一个int 并期望它的第一个参数是FILE *per the documentation

int fprintf(FILE *restrict stream, const char *restrict format, ...);

您需要先使用 s[n]printf() 格式化您的文本,如果这是您想要采取的方法 - 创建一个 C 样式的字符串并将其写入 C++ ofstream

char buffer[ BUF_SIZE ];
snprintf( buffer, sizeof( buffer ),
    "\"{\"GPU\": [%ic], \"System\": [%ic], \"CPU\": [%ic], \"HDD\": [%ic]}\"",
    temp[0], temp[1], temp[2], temp[7] );

...

temp_file << buffer;

...

在 C++ 中还有许多其他方法可以格式化输出。

【讨论】:

    【解决方案2】:

    使用boost::format:

    cout << boost::format("\"{\"GPU\": [%1%], \"System\": [%2%], \"CPU\": [%3%], \"HDD\": [%4%]}\"") % temp[0] % temp[1] % temp[2] % temp[3]; 
    

    【讨论】:

    • 为此增加过度杀伤力,例如使用手提钻从花生上取下壳。
    • @AndrewHenle,在不知道问题的范围的情况下,真的很难发表评论,现在真的那么难拉升压吗?
    • 在不知道问题范围的情况下,推荐Boost就更过分了。
    【解决方案3】:

    这个temp_file &lt;&lt; fprintf("\"{\"GPU\": [%ic], \"System\": [%ic], \"CPU\": [%ic], \"HDD\": [%ic]}\"", temp[0],temp[1],temp[2],temp[7]); 是错误的。您不能将 ofstreamfprintf 组合使用 - 使用其中之一。

    要将格式化输出写入使用io manipulators 的流,并且您不需要执行任何特殊操作来输出整数、字符串、双精度值等。

    【讨论】:

    • "你不能结合 ofstream 和 fprintf" 严格来说这是错误的说法。为什么不?只是以正确的方式去做。为什么要这样做以及要做什么 - 不同讨论的主题
    • fprintf 返回写入的字符数。该语句正在输出打印的字符数,所以是的,fprintf 可以与流插入运算符一起使用。
    • 是的,是的,但不是 OP 想要的方式,我相信你们非常清楚。
    【解决方案4】:

    fprintf 的第一个参数必须是指向标识流的 FILE 对象的指针,而不是 temp[0] (GPU)。

    C 库函数 int fprintf(FILE *stream, const char *format, ...) 将格式化输出发送到流。

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-01
      • 1970-01-01
      • 2015-12-14
      • 2021-08-24
      • 1970-01-01
      相关资源
      最近更新 更多