为什么反序读出来的文件会每行之间有一个空行?

时间:2022-04-24 04:25:53
下面这个程序想反序读取文件显示出来,结果每行之间有一个空行,不知怎么回事?
如原来文件有第一行abc 第二行def第三行opq,结果反序显示的
13
qpo

fed

cba
Press any key to continue
中间有空行。

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int main(void)
{
FILE *fp;
int last;
char ch;
int i;

fp = fopen("f:\\123.txt", "r");
fseek(fp, 0L, SEEK_END);
last = ftell(fp); 
printf("%d\n", last);

for( i=1L; i<=last; i++)
{
fseek(fp, -i, SEEK_END);
ch = getc(fp);
putc(ch, stdout);
}

putchar('\n');
return 0;
}

8 个解决方案

#1


正常顺序的\r\n反过来之后\n\r会被当成是2个换行符

#2


哦,这样呀,谢谢!

#3


换行符需特别处理。

#4


我又有点不明白,不是说读取时将\r\n换成\n吗?怎么又变成两个换行符了?
turingo,能不能请您把我的程序改动一下,变成没有空行的?

#5


仅供参考
#include <stdio.h>
FILE *f;
int c;
long offset;
char ln[100];
void main() {
    f=fopen("a.txt","rb");//必须用b方式打开,否则文件当前读位置会受\x0d \x0a \x1a等字符的干扰
    fseek(f,-1,SEEK_END);//倒数最后一个字节之前
    while (1) {
        c=fgetc(f);
        if ('\n'==c) {
            offset=ftell(f);//记住当前位置,即刚读字符后面
            fgets(ln,100,f);
            printf("%s",ln);
            fseek(f,offset-2,SEEK_SET);//回到刚才读位置之前一个位置,即c所在位置之前一个位置
        } else
            if (fseek(f,-2,SEEK_CUR)) {//回到刚才读位置之前一个位置,即c所在位置之前一个位置失败,说明已读到文件开头
                fseek(f,0,SEEK_SET);
                fgets(ln,100,f);//读文件第一行内容
                printf("%s",ln);
                break;
            }
    }
    fclose(f);
}

#6


zhao4zhong1,我试了一下您的程序,结果是以行为单位进行反序:
opqdef
abc
Press any key to continue
而我程序要求是以单个字符为单位进行反序:
qpo

fed

cba
Press any key to continue

#7


给ch加个判断,如果是\r就不输出

#8


综合大家的回复,我解决了。确实如zhao4zhong1所说,要用b方式打开。用rb就行了,只用r不行。然后再加上判断\r就行了。我把改后的程序贴在下面。

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
 
int main(void)
{
    FILE *fp;
    int last;
    char ch;
    int i;
 
    fp = fopen("f:\\123.txt", "rb");
    fseek(fp, 0L, SEEK_END);
    last = ftell(fp); 
    printf("%d\n", last);
 
    for( i=1L; i<=last; i++)
    {
        fseek(fp, -i, SEEK_END);
        ch = getc(fp);
        putc(ch, stdout);
    }
 
    putchar('\n');
    return 0;
}

#1


正常顺序的\r\n反过来之后\n\r会被当成是2个换行符

#2


哦,这样呀,谢谢!

#3


换行符需特别处理。

#4


我又有点不明白,不是说读取时将\r\n换成\n吗?怎么又变成两个换行符了?
turingo,能不能请您把我的程序改动一下,变成没有空行的?

#5


仅供参考
#include <stdio.h>
FILE *f;
int c;
long offset;
char ln[100];
void main() {
    f=fopen("a.txt","rb");//必须用b方式打开,否则文件当前读位置会受\x0d \x0a \x1a等字符的干扰
    fseek(f,-1,SEEK_END);//倒数最后一个字节之前
    while (1) {
        c=fgetc(f);
        if ('\n'==c) {
            offset=ftell(f);//记住当前位置,即刚读字符后面
            fgets(ln,100,f);
            printf("%s",ln);
            fseek(f,offset-2,SEEK_SET);//回到刚才读位置之前一个位置,即c所在位置之前一个位置
        } else
            if (fseek(f,-2,SEEK_CUR)) {//回到刚才读位置之前一个位置,即c所在位置之前一个位置失败,说明已读到文件开头
                fseek(f,0,SEEK_SET);
                fgets(ln,100,f);//读文件第一行内容
                printf("%s",ln);
                break;
            }
    }
    fclose(f);
}

#6


zhao4zhong1,我试了一下您的程序,结果是以行为单位进行反序:
opqdef
abc
Press any key to continue
而我程序要求是以单个字符为单位进行反序:
qpo

fed

cba
Press any key to continue

#7


给ch加个判断,如果是\r就不输出

#8


综合大家的回复,我解决了。确实如zhao4zhong1所说,要用b方式打开。用rb就行了,只用r不行。然后再加上判断\r就行了。我把改后的程序贴在下面。

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
 
int main(void)
{
    FILE *fp;
    int last;
    char ch;
    int i;
 
    fp = fopen("f:\\123.txt", "rb");
    fseek(fp, 0L, SEEK_END);
    last = ftell(fp); 
    printf("%d\n", last);
 
    for( i=1L; i<=last; i++)
    {
        fseek(fp, -i, SEEK_END);
        ch = getc(fp);
        putc(ch, stdout);
    }
 
    putchar('\n');
    return 0;
}