以二进制模式读取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();
命令时,这似乎正在发生(第二行以绿色突出显示为清晰):
第一行打印正常,然后到达新行,这是发生错误的地方,新行似乎被删除,只有光标跳回到行的开头,这种行为不是预期的,也不是它想要的。
答案 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
语句换行,但不是将光标发送到行首的回车符,表示文本文件的第一部分被第二部分覆盖。