为什么这个简单的c片段不起作用

时间:2012-08-12 12:34:40

标签: c file-io

我想创建一个小的加密程序,我想从文件中读取字符,只需将i的当前值添加到字符中并将其存储在新文件中。

  

示例: abcd 应存储为 aceg

以下是代码段:

main()
{
   int i=0,c;
   char filename[30],o_filename[30];
   FILE *file,*outfile;
   printf("\nEnter filename:");
   scanf("%s",&filename);
   printf("\nEnter output filename : ");
   scanf("%s",&o_filename);
   if( ( (file = fopen(filename,"a"))==NULL) || ((outfile = fopen(o_filename,"a+"))==NULL))
   printf("\nERROR - Cannot proceed");
   else
   {
       c = 0;
       while(c!=-1)
       {
                   c = getc(file);
                   putc((c+i),outfile);
                   i++;
       }
       printf("\nEncryption Successful!\n");
    }
    getch();
}

上述程序的错误是什么?

2 个答案:

答案 0 :(得分:1)

函数getc返回int,而不是charEOF无法表示char

c的类型更改为int并在循环中针对EOF进行测试。

修改

要解决由marc发现的一个错误,你可以试试这个成语:

while ((c = getc(file)) != EOF)

答案 1 :(得分:1)

正如cnicutar所说,getc返回一个int,因此c应该声明为int c

首先,正如cnicutar所说,您需要将cEOF进行比较,即while (c != EOF)。此外,当您循环浏览文件并结束时,会发生什么?在最后一次迭代中,c = getc(file)将为EOF,但您仍然将其用于putc(EOF+i,outfile)

尝试使用以下两种方法之一来解决此问题:

    do {
        c = getc(file);
        putc(c+i, outfile);
        i++;
    } while (c != EOF);

    c = getc(file);
    while (c != EOF) {
        putc(c+i, outfile);
        i++;
        c = getc(file);
    }

修改

正如cnicutar指出的那样,最后一个片段可以使用常见的getc成语进行压缩,如下所示:

    while ((c = getc(file)) != EOF) {
        putc(c+i, outfile);
        i++;
    }