将一个文件的内容反向复制到另一个文件中

时间:2013-12-24 02:58:44

标签: c visual-studio-2010

我有以下代码,我正在尝试将一个文件的内容反向写入另一个文件

# include <stdio.h>
# include <conio.h>
# include <process.h>

void main()
{
    FILE *f1,*f2;
    char file1[20],file2[20];
    char ch;
    int n;
    printf("Enter the file1 name:");
    scanf("%s",file1);
    printf("Enter the file2 name:");
    scanf("%s",file2);
    f1=fopen(file1,"r");
    f2=fopen(file2,"w");
    if(f1==NULL || f2==NULL)
    {
        printf("Cannot open file");
        exit(1);
    }
    printf("Characters to read from end of file :");
    scanf("%d",&n);
    fseek(f1,-n,SEEK_SET);
    while(!feof(f1))
    {
        ch=fgetc(f1);
        fputc(ch,f2);
    }
    fcloseall();
    getche();

但执行后,内容不是按相反的顺序写入,而是按原样复制,我使用了

fseek(f1,-n,SEEK_SET).

我不确定我哪里出错了。

3 个答案:

答案 0 :(得分:2)

确定file1

的长度
fseek(file1, 0, SEEK_END);
int file1Length = ftell(file1);

file1的内容写入file2,反之亦然:

for(int filePos = file1Length; filePos >= 0; filePos--)
{
    fseek(file1, filePos, SEEK_SET);
    fputc(fgetc(file1), file2); 
} 

答案 1 :(得分:2)

循环中的fgetc向前发挥作用。要向后阅读,您需要在循环中添加fseek(f1, -2, SEEK_SET)

你需要-2,因为你需要倒回刚读过的单个字符,然后再回到另一个位置才能到达角色。

我觉得你不需要这行

 fseek(f1,-n,SEEK_SET);

根本 - 您需要从文件末尾读取。这会将文件指针定位到最后一个要写入的字符的正确位置(反向)。你想要

fseek(f1,0,SEEK_END);

(然后你必须考虑我上面所说的内容)。

如果您只需将所需数量的字符读入临时缓冲区并反向写入,那么任务就会容易得多。

答案 2 :(得分:0)

下面的程序在控制台上以相反的顺序打印文件。您可以将其写入另一个文件而不是控制台。

#include <stdio.h>
#include <errno.h>
int main(void)
{
    char c;
    FILE *ifp, *fp2;
    char *fileName="a.txt";
    ifp= fopen(fileName, "rb");/* binary mode for ms-dos */
    fseek(ifp,0L, SEEK_END);/* move to end of the file */
    fseek(ifp,-1L, SEEK_CUR);/* back up one character */
    do
    {
        c = fgetc(ifp);/* move ahead one character*/
        putchar(c);
        fseek(ifp,-2L, SEEK_CUR);/* back up twocharacters*/
    } while (ftell(ifp)>0); 
    c = fgetc(ifp);/* move ahead one character*/
    putchar(c);
    fclose(ifp);
    getch();
    return 0;
}