gpt4 book ai didi

c - 删除新行和 printf 的问题

转载 作者:可可西里 更新时间:2023-11-01 09:27:37 35 4
gpt4 key购买 nike

一个 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

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

最佳答案

试试这个

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 类型的文件,您将在行之间得到两个 .,但是您可以修改它,前提是您知道您只会拥有 ms -dos 类型 .txt 文件

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

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

关于c - 删除新行和 printf 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49998969/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com