读取文件并返回到c语言中的缓冲区变量



我需要从文件中读取文本并将其传递回主函数,我在EOF之后总是得到3个字符,为什么会发生这种情况?

#include<stdio.h>
#include<string.h>
int activenw(char *);
void main()
{
    char act_con[50];
    int len,i;
    len=activenw(act_con);
    for(i=0;i<=len;i++)
    {
        printf("%c",act_con[i]);
    }
}
int activenw(char *buff)
{
    char ch="";
    FILE *fp;
    int i=0;
    fp=fopen("abc.txt","r");
    if(fp==NULL)
    {
        printf("Error opening a file :");
        exit(0);
    }
    while((ch=fgetc(fp))!=EOF)
    {
        printf("%c",ch);
        *buff=ch;
        buff++;
        i++;
    }
    fclose(fp);
    return i;
}

这个实现是正确的吗?

在函数中,实际上并没有以空终止字符串。除非您的"字符串"能够包含NUL字符,否则最好将其视为字符串而不是字符数组。然而,这只是一般的建议,与你的具体问题无关。

首先,fgetc的返回代码是int(而不是char),因为它必须能够表示每个字符加上 EOF。其次,""不是一个字符,它是一个字符指针指向字符串常量。如果你想使用NUL 字符,应该使用单引号,而不是双引号。

最后,在main中循环打印字符:它使用<=,这会给你比你想要的多一个字符-使用<代替。

假设len == 0,这个循环将运行多少次?for(i=0;i<=len;i++)就是这样打印字符的吗?

一个char能代表一个unsigned char的所有值吗?它可能有这种能力……如果可以,是否也可以表示负值EOF ?假设char是一个无符号类型,考虑(ch=fgetc(fp))的签名。(unsigned char) EOF会和EOF相等吗?fgetc返回int,这样做是因为int可以表示每个unsigned char值,以及负的EOF值。ch显然应该是int,因此您可以正确区分EOF(非字符)和unsigned char值。

首先,将i <= len改为i <这样就不会再多算一个字符了。其次,使用hexdump程序检查文件是否有额外的新行字符或初始unicode字节顺序标记。>

最新更新