在文件中交换两行

时间:2017-10-29 17:29:15

标签: c

我正在编写一个程序,该程序必须将最后一行与文本文件中的最后一行交换为空格。我不能使用额外的文件。此外,文件对于内存来说可能太大,文件的每一行也不能完全保存在内存中。我有一个交换两行的函数,它使用函数" swap_Next_Lines"它交换第N蚂蚁(第N + 1)行。第N行的偏移作为从ftell()获得的参数传递给函数。我使用固定大小的缓冲区来交换两行。但它工作不正常,它混合了文件中的所有行。我的算法:读取str1中的前k个符号,读取str2中的下k个符号,然后转到开始并写入str2,然后读取str1。重复直到ftell()返回一个更大的值或eq到第二行的结尾。我们重复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;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

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