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

时间:2013-03-15 01:20:38

标签: 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="\0";
    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;
}

这个实现是否正确?

3 个答案:

答案 0 :(得分:1)

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

首先,fgetc的返回代码是int(不是char),因为它必须能够代表每个字符 plus {{1} }。

其次,EOF不是字符,它是字符串指针到字符串常量。如果你想要NUL 字符,你应该使用单引号,而不是双引号。

最后,您在"\0"的循环中打印出字符:它使用的main会给您一个比您想要的更多的字符 - 请改用<=

答案 1 :(得分:0)

假设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值。

答案 2 :(得分:0)

首先,将i&lt; = len改为i&lt; len使它不再计算1个字符。其次,使用hexdump程序检查您的文件是否没有额外的新行字符或初始unicode字节顺序标记。