我们需要从文件中删除非 ASCII 字节。编写一个 C 程序,leave_only_ascii.c,它接受一个参数,一个文件名。leave_only_ascii.c 应该从文件中删除所有非 ASCII 字节。运行后,该文件应仅包含一个 ASCII 字节。它应该在标准输出上不打印任何内容。它应该只更改文件。如果一个字节包含 128..255 之间的值,则假定它是非 ASCII 字节。下面有机翻。
代码如下:
#include <stdio.h>
#include <stdlib.h>
//buf是存储文件的缓冲区,lSize是文件大小
char* textFileRead(char* filename,int *lSize)
{
char* buf;
FILE *pf = fopen(filename,"r");
if(pf == 0)
{
printf("文件打开失败");
return 0;
}
fseek(pf,0,SEEK_END);
*lSize = ftell(pf);
// 用完后需要将内存free掉
rewind(pf);
buf = (char*)malloc(*lSize+1);
*lSize = fread(buf,sizeof(char),*lSize,pf);
buf[*lSize] = '\0';
fclose(pf);
return buf;
}
int main(int argc, char *argv[])
{
char* buf;
int i,len,cnt = 0;
FILE* fp;
if(argc != 2)
{
printf("参数不符合要求");
return 0;
}
buf = textFileRead(argv[1],&len);
//打开文件
if( (fp = fopen(argv[1],"w")) ==0)
{
printf("文件打开失败\n");
return 0;
}
for (i=0;i<len;i++)
{
if (buf[i] >= 0 && buf[i] < 128)
{
fwrite(&buf[i],1,1,fp);
}
}
fclose(fp);
free(buf);
buf = 0;
return 0;
}
fopen打开文件,fget逐个字节读取存入数组,如果大于0x80则忽略,最后将数组的数据写入文件即可