2017-02-24 180 views
1

所以我打开一个文件,允许调用文件key.txt将文字写入文件?

FILE *fp; 
    fp = fopen("key.txt", "r"); 

现在可以说,我有我的代码打开“一”将追加到它的另一个文件(FA)。现在即时通讯从fp读取所有字符,并将每个字母字符附加到文件fp,但它的附加内容比这更多。

char c; 
    do { 
     c = getc(fp); 
     if(isalpha(c)){ 
      fprintf(fa, &c); 
      fprintf(fa, "\n"); 
     } 
    } while(c != EOF); 

好了,所以这对我来说很好,现在是将每个字母字符的文件,但问题是,它甚至还添加了更多字符文本的单行。我试图找出这个问题。 下面是一个例子,里面key.txt我们

lol 
    xd 

输出文件足协内容

l<82>^0)y^? 
    o<82>^0)y^? 
    l<82>^0)y^? 
    x<82>^0)y^? 
    d<82>^0)y^? 

所以我不会得到什么是怎么回事。我该如何解决?我不知道确切的问题是什么

+5

'fprintf中(FA,&c);' - >'fprintf中(FA, “%C”,C);' –

+0

@SouravGhosh该工作表示感谢?你!Craig Estey,我用-Wall编译,它工作的很好 – reVolutionary

+0

是的,它确实编译了[我再次查看后再次检查],这就是为什么我删除了我的第一条评论。'&c' [技术上讲]会是'char *',并且被编译器中的格式扫描器所接受,它不能够推断出它不是'char fmt [2]'的等价物,并且在调用'fp时将其标记为 –

回答

5

您正在使用fprintf()错误。从man page,预期的格式是

int fprintf(FILE *stream, const char *format, ...); 

其中,第一个参数是将文件指针,第二个是在转换说明和第三个起的(是)的参数(一个或多个)所提到的转换指定。

引用C11,章§7.21.6.1,fprintf(),对于格式说明

c

如果没有l长度改性剂是目前,int参数被转换为一个 unsigned char,并且结果字符被写入。 [...]

所以,在情况下,你想要写一个字,你需要使用像

fprintf(fa, "%c", c); //%c for character, no '&' needed before variable 

也就是说,getc()返回int所以你应该获取返回值在int变量中。

道德故事:启用编译器警告。

1

你的代码段有几个问题:

char c; 
do { 
    c = getc(fp); 
    if(isalpha(c)){ 
     fprintf(fa, &c); 
     fprintf(fa, "\n"); 
    } 
} while(c != EOF); 
  • c应与int类型,以适应unsigned char类型的所有值加上特殊负值EOF声明。

  • fprintf必须传递格式字符串。 fprintf(fa, &c);有未定义的行为。使用fprintf(fa, "%c", c);或简单地putc(c, fa);未定义行为意味着任何事情都有可能发生:乱码输出是一种可能性,程序崩溃是另一个...

  • 检查EOF在循环进一步处理之前。 do { ... } while循环不合适,请改为使用while ((c = getc(fp)) != EOF) { ... }

这里是一个修正版本:

int c; 
while ((c = getc(fp)) != EOF) { 
    if (isalpha(c)) { 
     fprintf(fa, "%c\n", c); 
    } 
}