关于嵌入式操作系统的一个题目,编写一个c语言程序,其功能是将一个文本文件读出,然后再反序写回。
课程设计
1
在LINUX操作系统上编写一个c语言程序,其功能是将一个文本文件读出,然后再反序写回。谢谢大家,我都不懂什么意思。
-
'''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每调用一次,可以检查文件内容是否翻转即可进行验证。你也可以不用程序创建测试文件,可以直接传一个自己的文件名给它进行测试,程序算法有优化,速度应该比较快,程序会直接在原来的文件上进行倒序,会覆盖原来的内容,并支持大内容文件(依赖于你的操作系统),但不会使用很多内存。
-
比如你的一个文件是:1.txt; 该1.txt文件中的内容是:abcdefg
那么你读出来放在一个缓冲buf中后,然后再以相反的顺序写入该文件1.txt中,这样文件1.txt中现在的内容即为:gfedcba
发表回复