C 反转文件的n个字符
我正试图写一个小程序来反转文件中文本的前n个字符。我写道:C 反转文件的n个字符,c,file-io,C,File Io,我正试图写一个小程序来反转文件中文本的前n个字符。我写道: void getdata(FILE *fp) { char ch; printf("Enter text::\n"); while((ch=getchar())!=EOF) fputc(ch,fp); } void printdata(FILE *fp) { char ch; while((ch=fgetc(fp))!=EOF) putchar(ch); } v
void getdata(FILE *fp)
{
char ch;
printf("Enter text::\n");
while((ch=getchar())!=EOF)
fputc(ch,fp);
}
void printdata(FILE *fp)
{
char ch;
while((ch=fgetc(fp))!=EOF)
putchar(ch);
}
void reverse(FILE *fp, int n)
{
char ch[20];
for( int i=0;i<n;++i)
ch[i]=fgetc(fp);
rewind(fp);
printf("%.*s\n",n,ch); //printing the string
while(n--)
fputc(ch[n-1],fp);
}
int main()
{
FILE *fp;
int n;
fp=fopen("music.txt","w+");
getdata(fp);
rewind(fp);
printf("Number of chars to reverse:: ");
scanf("%d",&n);
reverse(fp,n);
rewind(fp);
printf("After reversing text is::\n");
printdata(fp);
fclose(fp);
return 0;
}
void getdata(文件*fp)
{
char ch;
printf(“输入文本::\n”);
而((ch=getchar())!=EOF)
fputc(ch,fp);
}
无效打印数据(文件*fp)
{
char ch;
而((ch=fgetc(fp))!=EOF)
putchar(ch);
}
无效反向(文件*fp,int n)
{
char-ch[20];
对于(int i=0;i
当控制达到fputc(ch[n-1],fp)时,在while(n-)
之后的while循环中
n已经递减。while中的错误是第一个循环递减n
。在您的用例中n
从4
开始,而不是5
。然后您将字符分配到n-1
,这意味着n
必须从5
开始。最后,您的循环是4de>时间长,而不是5
改变
while(n--)
fputc(ch[n-1],fp);
到
另一件小事。在您的例子20中,您的反向函数不是检查n passed不能>为ch长度。@Javia1492 heh?相反,您应该建议,因为EOF
可能不适合char
,将ch
类型更改为int
@Lokesh Jaddu,如果您没有注意到,func中可能存在缓冲区溢出tionreverse()
@Javia1492 1)您找到了哪一行eof()
?请为我指出。2)什么是getchar()的返回类型
?我不是在暗示什么。我谦虚地告诉你,这很糟糕。希望你不介意。:-@Javia1492很好,很高兴我能帮上忙。那么让我们删除不必要的注释,好吗?很好。while(n-)…
构造仍然是向后迭代的好习惯用法,但它必须访问ch[n]
而不是ch[n-1]
。因此,一个没有模糊索引的简单解决方案是,而(n--)fputc(ch[n],fp);
。是的,当然。你的解决方案更快。我希望我的解决方案对OP来说更清晰。你的答案很好。这更多的是一个附加注释。(可能只是对我自己说,因为我看了代码没有看到错误。这就是idoims的问题:它们可能会让你忽略显而易见的东西。)
for( int i=0;i<n;++i) //consider n as 5
fputc(ch[n-1-i],fp);// ch[5-1-0] ch[5-1-1] ch[5-1-2] ...
while(n--) //consider n as 5
fputc(ch[n-1],fp); //ch[4-1] ch[3-1] ....
while(n--)
fputc(ch[n-1],fp);
do
{
fputc(ch[n-1],fp);
}while(--n);