gpt4 book ai didi

c - 文件的结束值打印为问号

转载 作者:行者123 更新时间:2023-11-30 15:23:47 25 4
gpt4 key购买 nike

我在从一个文件写入另一个文件时遇到问题,特别是最后一个值(文件结尾)打印为黑色方 block 中的问号。

我的代码应该在某些条件下替换文本,效果很好,只是最后一个值 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;
}

最佳答案

跳过“123”的原因是因为计数poc在上次读取文件后悬空。有两种方法可以解决这个问题。

1) 在文件最后一行的末尾添加一个换行符。您最初没有跳过“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;
}

关于c - 文件的结束值打印为问号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28649327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com