Zero-Se
2018-12-24 15:50
采纳率: 91.7%
浏览 979

关于嵌入式操作系统的一个题目,编写一个c语言程序,其功能是将一个文本文件读出,然后再反序写回。

在LINUX操作系统上编写一个c语言程序,其功能是将一个文本文件读出,然后再反序写回。谢谢大家,我都不懂什么意思

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • 软侠 2018-12-25 09:18
    已采纳

    你好,这个问题看起来简单,但还是需要一定的技巧的,也有点麻烦,为了能得到你的分以能下点资料,专门为你写了一个完整程序(下面代码本是非常完整的,但可能因为这个CSDN的编辑器有问题,导致有些显示不全或不正常,请注意一下,基本上是可以直接拷贝使用的),并进行了测试,希望能把分给全给我:
    '''C
    #include < stdlib.h>
    #include < stdio.h >
    #include < errno.h>
    #include < sys/stat.h>
    #include < unistd.h>

    #define BUFF_SIZE 4096

    int create_test_file(char* file_path)
    {
    FILE* pf = fopen(file_path, "w");
    if (pf == 0)
    {
    return 0;
    }

    int i = 10000, j = 0;
    for (; i > 0; --i)
    {
        for (j = 0; j < 10; ++j)
        {
            fprintf(pf, "%d", j);
        }
        fprintf(pf, "%s", "\n");
    }
    fflush(pf);
    fclose(pf);
    
    return 1;
    

    }

    size_t get_file_size(const char *path)
    {
    size_t fsize = -1;

    struct stat stbuff;
    if (stat(path, &stbuff) < 0)
    {
    return fsize;
    }
    else
    {
    fsize = stbuff.st_size;
    }
    return fsize;
    }

    void reverse_buff(char* buff, int buflen)
    {
    int i = 0, j = buflen / 2, k = buflen % 2;
    char c;
    for ( ; i < j; ++i)
    {
    c = buff[i];
    buff[i] = buff[buflen - i - 1];
    buff[buflen - i - 1] = c;
    }
    }

    void change_buff_block(FILE* pf, size_t fsize, int left_block, int left_size, int right_size)
    {
    char buff1[BUFF_SIZE];
    char buff2[BUFF_SIZE];
    size_t rs, ws;

    fseek(pf, BUFF_SIZE * left_block, SEEK_SET);
    rs = fread(buff1, left_size, 1, pf);
    reverse_buff(buff1, left_size);
    
    if (right_size > 0)
    {
        fseek(pf, fsize - BUFF_SIZE * left_block - right_size, SEEK_SET);
        rs = fread(buff2, right_size, 1, pf);
        reverse_buff(buff2, right_size);
    
        fseek(pf, BUFF_SIZE * left_block, SEEK_SET);
        ws = fwrite(buff2, right_size, 1, pf);
    
        fseek(pf, fsize - BUFF_SIZE * (left_block + 1), SEEK_SET);
        ws = fwrite(buff1, left_size, 1, pf);
    }
    else
    {
        fseek(pf, BUFF_SIZE * left_block, SEEK_SET);
        ws = fwrite(buff1, left_size, 1, pf);
    }
    

    }

    int main(int argc, char* argv[])
    {
    if (argc < 1)
    {
    printf("please pass test file as first arg!");
    return -1;
    }
    char* file = argv[0];
    if (argc > 1 && argv[1][0] == 'c' && !create_test_file(file))// if create test file
    {
    printf("create test file failed!");
    return -1;
    }

    size_t fsize = get_file_size(file);
    if (fsize <= 0)
    {
        printf("file not exists or is empty!");
        return -1;
    }
    
    size_t remsize = fsize % BUFF_SIZE;
    int buff_cnt = fsize / BUFF_SIZE + (remsize > 0 ? 1 : 0);
    int inv_cnt = buff_cnt / 2;
    
    FILE* pf = fopen(file, "r+");
    if (pf == 0)
    {
        printf("cannot open file!");
        return -1;
    }
    
    int i, j;
    for (i = 0; i < inv_cnt - 1; ++i)
    {
        change_buff_block(pf, fsize, i, BUFF_SIZE, BUFF_SIZE);
    }
    if (buff_cnt % 2 > 0)
    {
        change_buff_block(pf, fsize, i, BUFF_SIZE, BUFF_SIZE);
        change_buff_block(pf, fsize, ++i, remsize, 0);  
    }
    else if (remsize > 0)
    {
        change_buff_block(pf, fsize, i, BUFF_SIZE, remsize);
    }
    else
    {
        change_buff_block(pf, fsize, i, BUFF_SIZE, BUFF_SIZE);
    }
    
    fflush(pf);
    fclose(pf);
    
    printf("test ok!");
    
    return 0;
    

    }

    把上面代码直接拷到你的编辑器中用gcc编译即可,测试方法:
    //假定你编译后的程序名为test,第一个参数是测试文件路径,第一次调用时传入第二个参数c,表示会创建测试文件(文件内容为10000行0123456789):
    ./test /home/user1/test.txt c
    调用完成后检查所有行是否是987654310行的倒序。第二次及以后调用时去掉第二个参数:
    ./test /home/user1/test.txt
    每调用一次,可以检查文件内容是否翻转即可进行验证。你也可以不用程序创建测试文件,可以直接传一个自己的文件名给它进行测试,程序算法有优化,速度应该比较快,程序会直接在原来的文件上进行倒序,会覆盖原来的内容,并支持大内容文件(依赖于你的操作系统),但不会使用很多内存。

    点赞 打赏 评论
  • 君子黎 2018-12-24 09:02
    比如你的一个文件是:1.txt; 该1.txt文件中的内容是:
    abcdefg
    那么你读出来放在一个缓冲buf中后,然后再以相反的顺序写入该文件1.txt中,这样文件1.txt中现在的内容即为:
    gfedcba
    
    

    若果帮助,还望采纳!!!谢谢。

    点赞 打赏 评论
  • weixin_43952032 2018-12-25 03:40

    如果用C编程来实现这个功能 那么写法是一样的。

    点赞 打赏 评论

相关推荐 更多相似问题