我遇到从一个文件写入另一个文件的问题,特别是最后一个值,即文件末尾,在黑色方块中打印为问号。
我的代码应该在某些条件下替换文本,这些条件完全适用于最后一个值,即EOF会产生一些问题。
有什么想法吗?
输入文件
Hi, this is *list* version v2.
Contains 8 words. 123
输出文件
___, _____ ___ *_____* _____ ___.
_____ ___ _____. ___�
C源文件
int main()
{
FILE *li, *sa;
li = fopen("list.txt", "r");
sa = fopen("sablona.txt", "w");
int c, poc = 0;
char a[3] = "___";
char b[5] = "_____";
while ( ! feof(li) > 0 ) {
c = getc(li);
if ( isalnum(c) )
poc++;
else if ( poc > 0 && poc < 4 ) {
fputs(a, sa);
poc = 0;
}
else if ( poc >= 4 ) {
fputs(b, sa);
poc = 0;
}
if ( ! isalnum(c) )
putc(c, sa);
}
fclose(li);
fclose(sa);
return 0;
}
答案 0 :(得分:1)
跳过“123”的原因是因为在最后一个文件读取后,计数poc
悬空。有两种方法可以解决这个问题。
1)将newline
添加到文件中最后一行的末尾。您最初不跳过“123”的原因是因为您将EOF值视为一个字符。更好的是 -
2)在循环终止后,通过重复测试来检查悬空poc
值。
代码(上面评论中建议的更正)看起来像这样。
#include <stdio.h>
#include <ctype.h>
int main(void) {
FILE *li, *sa;
int c, poc=0;
char a[] = "___"; // removed length spec
char b[] = "_____"; // removed length spec
li = fopen("test.txt", "r");
sa = fopen("sablona.txt", "w");
while((c = getc(li)) != EOF) { // altered end-of-file check
if(isalnum(c))
poc++;
else if(poc>0 && poc<4){
fputs(a, sa);
poc = 0;
} else if(poc>=4){
fputs(b, sa);
poc = 0;
}
if(!isalnum(c))
putc(c, sa);
}
if(poc>0 && poc<4){ // check for dangling poc
fputs(a, sa);
poc = 0;
} else if(poc>=4){
fputs(b, sa);
poc = 0;
}
fclose(li);
fclose(sa);
return 0;
}