Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 反转文件的n个字符_C_File Io - Fatal编程技术网

C 反转文件的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

我正试图写一个小程序来反转文件中文本的前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);
}

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中可能存在缓冲区溢出tion
reverse()
@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);