删除新行和 printf 的问题
Issue with removing new lines & printf
一个 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();
命令时,这似乎正在发生(为清楚起见,第二行以绿色突出显示):
第一行打印正常,然后到达新行,这是发生错误的地方新行似乎被删除了,只是光标跳回到行首,这种行为既不是预期的也不是想要的。
试试这个
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 - 换行和回车 return。一个不良后果是,对于 ms-dos 类型的文件,您将在行之间得到两个 .
s,但是您可以修改它,前提是您 knew 您只会拥有 ms -dos 类型 .txt
文件
我添加的另一件事可能是必要的也可能不是必要的是 fflush(stdout);
因为通常当您 printf
时东西不会立即出现在屏幕上,这应该强制打印东西。可能没有必要。
我认为你将一行写在另一行之上的原因是因为你有一个 dos 类型的 .txt
文件,每个文件的末尾都有一个回车符 return 和一个换行符line - 你正在用你的 \n
if
语句捕捉换行符,而不是 return 将光标发送到行的开头并意味着文本文件的第一部分被第二部分覆盖。
一个 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();
命令时,这似乎正在发生(为清楚起见,第二行以绿色突出显示):
第一行打印正常,然后到达新行,这是发生错误的地方新行似乎被删除了,只是光标跳回到行首,这种行为既不是预期的也不是想要的。
试试这个
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 - 换行和回车 return。一个不良后果是,对于 ms-dos 类型的文件,您将在行之间得到两个 .
s,但是您可以修改它,前提是您 knew 您只会拥有 ms -dos 类型 .txt
文件
我添加的另一件事可能是必要的也可能不是必要的是 fflush(stdout);
因为通常当您 printf
时东西不会立即出现在屏幕上,这应该强制打印东西。可能没有必要。
我认为你将一行写在另一行之上的原因是因为你有一个 dos 类型的 .txt
文件,每个文件的末尾都有一个回车符 return 和一个换行符line - 你正在用你的 \n
if
语句捕捉换行符,而不是 return 将光标发送到行的开头并意味着文本文件的第一部分被第二部分覆盖。