我有以下代码,我正在尝试将一个文件的内容反向写入另一个文件
# 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).
我不确定我哪里出错了。
答案 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;
}