c - 交换文件中的两行

标签 c

我正在编写一个程序,该程序必须将最后一行(不带空格)与文本文件中的最后一行交换。我不能使用额外的文件。此外,文件对于内存来说可能太大,文件的每一行也无法完全保留在内存中。我有一个交换两行的函数,它使用函数“swap_Next_Lines”交换第 N Ant (N+1) 行。第 N 行的偏移量作为从 ftell() 获取的参数传递给函数。我使用固定大小的缓冲区来交换两行。但它工作不正确,它混合了文件中的所有行。我的算法:读取str1中的前k个符号,读取str2中的后k个符号,然后转到开头写入str2,然后写入str1。重复直到 ftell() 返回一个大于或等于第二行末尾的值。我们重复 Max_Len/Buf_size 次。这是该函数的代码:(在使用GDB时我发现了一些错误并修复了,但有时它仍然工作不正确)

void swap_Next_Lines(FILE *fin, long base_pos) { 

    int c, i;
    long len1 = 1, len2 = 1, width, tmp_pos, fin_pos, base_pos1;
    char str1[BUF_LEN + 1], str2[BUF_LEN + 1];

    fseek(fin, base_pos, SEEK_SET);

    while (((c = fgetc(fin)) != EOF) && (c != '\n')) {
        len1 ++;
    }

    while (((c = fgetc(fin)) != EOF) && (c != '\n')) {
    len2 ++;
    }
    fin_pos = ftell(fin);

    width = len1 / BUF_LEN;
    width++;

    for(i = 0; i < width; i++) {
        base_pos1 = base_pos;
        fseek(fin, base_pos, SEEK_SET);

        while(1) {

            fseek(fin, base_pos1, SEEK_SET);
            fgets(str1, BUF_LEN + 1, fin);
            tmp_pos = ftell(fin);
            if (tmp_pos >= fin_pos) {
                break;
            }
            fgets(str2, BUF_LEN + 1, fin);

            fseek(fin, base_pos1, SEEK_SET);
            fputs(str2, fin);
            fputs(str1, fin);

            base_pos1 += strlen(str2);

            if (base_pos1 >= fin_pos) {
                break;
            }
        }
    }
}

最佳答案

终于找到了las bug:如果len1 mod bufsize = 0,那么我们不需要增量)

关于c - 交换文件中的两行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47003154/

相关文章:

c - 如何让我的 C 程序允许用户创建自己的文件名?

检查 C 中特定字符值的字符串?

c - C中循环单链表的优雅实现?

C Unix 管道示例

c++ - 从正在运行的程序中读取值

c - K&R 练习 2-7,优化?

c++ - 如何检测窗口已经最大化?

c - 在makefile中包含静态库来创建目标文件

c - 使用 omp 减少嵌套循环

c++ - 如何将复合数据类型的特定字段提取为数组