我正在编写一个程序,该程序必须将最后一行(不带空格)与文本文件中的最后一行交换。我不能使用额外的文件。此外,文件对于内存来说可能太大,文件的每一行也无法完全保留在内存中。我有一个交换两行的函数,它使用函数“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/