【问题标题】:Issue with removing new lines & printf删除新行和 printf 的问题
【发布时间】:2018-04-24 10:09:48
【问题描述】:

以二进制模式读取 txt 文件并存储在缓冲区中(我正在编写 HEX 编辑器,因此以二进制模式读取文件很重要):

以下代码删除所有新行并将 txt 打印到控制台:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

FILE *fileptr;
unsigned char *buffer;
long filelen;

int main(int argc, char* argv[]){

    fileptr = fopen(argv[1], "rb");
    fseek(fileptr, 0, SEEK_END);
    filelen = ftell(fileptr);
    rewind(fileptr);

    buffer = (char *)malloc((filelen+1)*sizeof(char));
    fread(buffer, filelen, 1, fileptr);
    fclose(fileptr); // Close the file

    for (int i = 0; i < filelen; i++){
        if (buffer[i] == '\n'){
            printf(".");
        }else{
            printf("%c", buffer[i]);
        }
    }
}

这是预期输出,我们想要的

这是实际输出,不是我们想要的

当添加sleep(); 命令时,这似乎正在发生(为清楚起见,第二行以绿色突出显示):

第一行打印正常,然后到达新行,这是发生错误的地方,新行似乎被删除了,只有光标跳回到行首,这种行为不是预期的,也不是想要的。

【问题讨论】:

  • 如何打开文件?文本模式还是二进制模式?
  • 请贴出真实完整的代码。从内存中键入一些随机文本很容易出错,而复制和粘贴则不然。您在循环中弄乱了索引变量。请发帖MCVE
  • Linux 和 Windows 有不同的方式来终止文本文件中的行。使用 Mingw 时,这会变得令人困惑,因为您必须决定遵循哪个标准。您运行的是 Linux 还是 Windows,文本文件属于哪个系统?
  • @BoPersson 看目录名肯定是Windows。
  • Windows 上的规范文本文件格式的每一行都以两个 ASCII 字符结尾:CR 后跟 LF。在 Windows 上的 C 中,这些字符代码应分别映射到 \r\n 转义代码。写入控制台时,CR 将光标移动到第一列,LF 将光标在同一列中向下移动一行。由于 CR 字符,您的动画显示光标移动到第一列。我建议在您的代码中用. 替换\n\r。然后输出将在每个原始文本行的末尾显示两个点。

标签: c windows printf mingw newline


【解决方案1】:

试试这个

for (int i = 0; i < len; a++){
    if ((buffer[i] == 10) || (buffer[i]==13)){
        printf(".");
    }else{
        printf("%c", buffer[a]);
    }
    fflush(stdout);
}

如您所知,unix、dos 和 mac .txt 文件有不同的方式来指示新行的开始,这可能会给您带来问题 - 在修改后的代码中,而不是寻找 \n 程序看起来对于 ascii 代码 10 和 13 - 换行和回车。一个不良后果是您将在 ms-dos 类型文件的行之间获得两个 .s,但如果您知道您只会有 ms-dos 类型 @987654325,您可以修改它@文件

我添加的另一件事可能需要也可能不需要是fflush(stdout);,因为通常当您printf 时,东西不会立即出现在屏幕上,这应该会强制打印。可能没有必要。

我认为你将一行写在另一行之上的原因是因为你有一个 dos 类型 .txt 文件,每行末尾有一个回车符和一个换行符 - 你正在捕捉换行符您的 \n if 语句,但不是将光标发送到行首的回车,这意味着文本文件的第一部分被第二部分覆盖。

【讨论】:

  • 感谢@tom,您的解决方案效果很好,也感谢您解释得这么好!!你是一个绝对的传奇!
  • @GCaldL- 很高兴这很有用,祝你好运
猜你喜欢
  • 2015-05-16
  • 2020-11-09
  • 2018-01-31
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多