2013-03-15 137 views
0

我需要从文件中读取文本并将其传回主函数,并且在EOF之后我总是会增加3个字符为什么会发生这种情况?读取一个文件并返回到缓冲区变量c

#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; 
} 

这个实现是否正确?

+2

void main()不是一个好兆头。与缩进相同。不倾向于做比这个提示更多的东西:fgetc()返回什么类型?当你明白为什么时,你也会意识到ch的类型不正确。 – 2013-03-15 01:23:17

回答

1

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

首先,从fgetc返回代码是int(不char),因为它必须能够代表每一个字符EOF

其次,"\0"不是一个字符,它是一个字符指针为一个字符串常量。如果你想NUL 字符,你应该使用单引号,而不是双引号。

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

+0

是的,但这并不重要,因为他使用len打印而不是%s。 – 2013-03-15 01:25:30

+0

我已经用'\ 0'(即)在我的代码* buff ='\ 0'中终止了字符串。我已经将i <= len移至i 2013-03-15 01:58:22

+0

@NaggappanRM,当它应该是一个'int'时,你仍然有'ch'作为'char'。但是,即使出现这种错误,您在(现已删除的)注释中给出的代码对我来说工作得很好,字符串hello(来自文件)和换行符(也在文件中)。如果你转储abc.txt(如果你在Linux上)'od -xcb abc.txt',你可能会在那里看到换行符。 – paxdiablo 2013-03-15 02:05:10

0

假设len == 0,这个循环会运行多少次? for(i=0;i<=len;i++)是你如何打印个字符?

Can a char代表unsigned char的所有值吗?它可能有这种能力......如果可以,它也可以代表负值EOF?假设char是无符号类型,请考虑(ch=fgetc(fp))的签名。 (unsigned char) EOF永远等于EOF? fgetc返回int,并且这样做是因为int可以表示每个unsigned char值以及负值EOF的值。 ch显然应该是int,所以你可以正确区分EOF(非字符)和unsigned char的值。

+0

因此,如果我不应该使用fgetc?那么什么功能会更好?如果我使用fscanf(fp,“%c”,ch);给我一个警告和分段错误(核心转储)错误 – 2013-03-15 02:12:18

+0

我说你不应该使用'fgetc'?再读一遍。当'fscanf'没有阅读手册时,可以预期这种警告和段错误。 'ch'的类型是什么?当你赋予'%c'格式说明符时'fscanf'会期望哪种类型?哪个手册告诉你这个? – Sebivor 2013-03-15 02:29:15

0

首先,将我< = len更改为我< len,以便它不会再计数1个字符。其次,使用hexdump程序检查你的文件是否没有额外的新行字符或初始unicode字节顺序标记。