【问题标题】:Can't read data from text file written by c program无法从c程序编写的文本文件中读取数据
【发布时间】:2021-11-02 08:12:21
【问题描述】:

我正在尝试将收到的数据包数量写入文本文件:

printf("TCP : %d   UDP : %d   ICMP : %d   IGMP : %d   Others : %d   Total : %d\r", tcp , udp , icmp , igmp , others , total);
if (usePacketCount == 1){
    fprintf(stderr,"Saving packet count");
    fprintf(packetCountFile,"TCP : %d   UDP : %d   ICMP : %d   IGMP : %d   Others : %d   Total : %d\r", tcp , udp , icmp , igmp , others , total);
}

当我运行程序时,我清楚地在代码中到达了这一点:

但是,当我尝试读取文本文件时,什么都没有:

我在这里定义我的文件:

FILE *packetCountFile = 0;

if (usePacketCount == 1){
    printf("Using Packet Count File");
    packetCountFile = fopen("packetCount.txt","w");
}

我不确定为什么会失败。可能是因为写循环,根本跟不上?

【问题讨论】:

  • fopen 是成功还是返回 NULL
  • 请提供一个小而完整的程序来表现这种行为。此外,请检查所有(重要的)I/O 操作是否成功:fopen()fprintf() 等。另外,请不要使用文本截图;您可以非常轻松地复制相关的文本输出。
  • 看起来它确实打印到文件,但由于末尾没有换行符而是回车符,文本编辑器显示存在许多字符但没有一行没有内容。
  • 你为什么写\r而不是\n? 898,964 个字符似乎不是空的。
  • @einpoklum 但是由于没有换行符,文本编辑器没有义务将内容识别为一行文本(假设 POSIX)。由于没有单行,它可能不会显示任何内容。

标签: c file writing


【解决方案1】:

首先,始终检查fopenfprintf 的返回值是否失败。其次,文本编辑器显示 0 行和 898964 个字符。这的东西。

发生了什么?

fprintf 的格式字符串以回车符(\r) 结尾,这会导致fprintf 写入并重复覆盖第一行。

好的,但为什么第一行没有出现在文本编辑器中?

这取决于系统和文本编辑器,但可能发生的是文本编辑器显示文本行。 POSIX defines一行如下

零个或多个非 字符加上一个终止 字符的序列。

由于fprintf 没有打印换行符,因此从技术上讲,该文件不包含一行。
一些文本编辑器对此比其他编辑器更宽松,实际上可能会显示一些内容。

您的问题:“可能是由于写入处于循环状态,根本跟不上?”

如果系统跟不上,您可能会认为fprintf 会失败或写入速度很慢。

我该如何解决这个问题?

将回车符 (\r) 替换为换行符 (\n),这可能是您最初要写的内容。

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 2018-03-21
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多