C语言,从文件中删除非 ASCII 字符

我们需要从文件中删除非 ASCII 字节。编写一个 C 程序,leave_only_ascii.c,它接受一个参数,一个文件名。leave_only_ascii.c 应该从文件中删除所有非 ASCII 字节。运行后,该文件应仅包含一个 ASCII 字节。它应该在标准输出上不打印任何内容。它应该只更改文件。如果一个字节包含 128..255 之间的值,则假定它是非 ASCII 字节。下面有机翻。

img

img

代码如下:



#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则忽略,最后将数组的数据写入文件即可