删除新行和问题的问题的printf

时间:2018-04-24 10:09:48

标签: c windows printf mingw newline

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

original file

以下代码删除所有新行并将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]);
        }
    }
}

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

这是实际输出,不是我们想要的incorrect/actual output

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

enter image description here

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

1 个答案:

答案 0 :(得分:2)

试试这个

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文件有不同的方式来指示新行的开头,这可能会导致问题 - 在修订后的代码中而不是查找{{1}该程序查找ascii代码10和13 - 换行和回车。一个不良后果是你会在ms-dos类型文件的行之间得到两个\n,但你可以修改一下,只要你知道你只有ms-dos类型.个文件

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

我认为你把一行写在另一行之上的原因是因为你有一个带有回车的dos类型printf文件和每行末尾的换行字符 - 你正在抓住使用.txt \n语句换行,但不是将光标发送到行首的回车符,表示文本文件的第一部分被第二部分覆盖。