-1

这是相同的代码。我面临的问题是,我无法在任何文件上写任何东西。请帮助解决这个问题

#include <stdio.h>
#include <string.h>

int main()

{
  FILE *fe;
  FILE *fo;
  FILE *fg;
  int i;
  int j,l;
  char ch;
  char tmp[100] ;

 fo = fopen("oddfile.txt","a");
 if (fo == NULL)
 {
  perror("ODDFILE");
 }
 fclose(fo);

 fe = fopen("evenfile.txt","a");
 if (fe == NULL)
 {
  perror("EVENFILE");
 }
 fclose(fe);

 fg = fopen("generalfile","r");
 if (fg == NULL)
 {
  perror("GENERALFILE");
 }

 while(ch = fgetc(fg)!=EOF)
 {
    if (ch != '\n' && ch != 't' && ch != ' ')
    {
        tmp[i] = ch;
        i++;
    }


    else 
    {
        printf("%s",tmp);
        l =strlen(tmp);
        j = l % 2;
        if (j == 0)
        {
          fe = fopen("evenfile.txt","ab");
            if (fe == NULL)
            {
                perror("EVENFILE");
             }  

         fwrite(&tmp,sizeof(tmp),1,fe);
         fclose(fe);

        }

        else
        {
            fo = fopen("oddfile.txt","ab");
            if (fo == NULL)
             {
                perror("ODDFILE");
             }
         fwrite(&tmp,sizeof(tmp),1,fo);
         fclose(fo);

        }
    }

 }

}   

我的代码编译成功但无法获得所需的输出

4

1 回答 1

1

改变:

 while(ch = fgetc(fg)!=EOF)

 while( (ch = fgetc(fg)) !=EOF)

优先规则使两者的行为不同。您对其进行编码的方式ch始终设置为 0 或 1,这两者都不是可打印的字符。

没有理由多次打开文件。只需在循环之前打开每个输出文件一次。明智的做法是使用fprintf而不是fwrite,并且不要使用大小tmp作为长度;你已经计算了字符串的长度,所以使用它!您可能还想在每个单词后写一个换行符或一些分隔符。如果输入包含大字,您确实需要检查堆栈溢出并处理它。盲目地假设您的输入单词将适合 100 个字符的数组,这是一场等待发生的灾难。strlen比未能在输入末尾放置空字符并调用可能不是字符串的字符数组稍差。(这是您遇到的另一个错误:您需要tmp在输入的末尾写入一个 NULL 。)

另请注意,收到一条错误消息非常烦人:

ODDFILE: no such file or directory

如果程序真正关心的文件不是“ODDFILE”。

最后(尽管这个短程序中完全有可能存在更多错误),停止依赖编译器中存在的行为只是为了符合 1983 年的标准实践是一个好主意。声明 main 函数正确地int main( void ),或者(甚至更好)使用int main( int argc, char **argv)并允许调用者指定输入文件名。并从 main 中返回一个值!也打开你的编译器警告,因为它们会给你有用的信息。

于 2013-09-29T11:37:18.603 回答