2011-10-10 92 views
0

我尝试使用以下,以从文件中读取一行检测EOL用C ...使用与fgets

while(fgets(c,BUF,f) != EOL){ 
    puts(c); 
} 

其中EOL = #define EOL '\n'但是,我得到的警告...... comparison between pointer and integer

什么是正确的方式来实现我想要的?

回答

4

与fgets读取一个字符串,则结果类型为char*

我想您所想的fgetc呢?

0

您需要取消引用返回的char*并将其与您的EOL进行比较...不会将实际指针地址本身与行尾字符进行比较。

你的代码改成这样:

char* return_val = NULL; 
while((return_val = fgets(c,BUF,f)) != NULL && *return_val != EOF) 
{ 
    puts(c); 
} 

if (retun_val == NULL) 
{ 
    //handle error 
} 
0

你必须调用fgets后检查的c内容,以确定是否换行被包含在返回的字符串:

 
for (;;) { 
if (fgets(c, BUF, f) == NULL) { /* handle error */ } 
if (strchr(c, EOL) != NULL) { 
    puts(c); 
} else {break; } 
} 
0

fgets从流中读取字符并将它们写入缓冲区,直到缓冲区几乎已满或发现'\n'(如果操作失败,则返回NULL)。

这样你就可以知道有多少characeters被读取(包括'\n')与strlen ...

ret = fgets(buffer, sizeof buffer, stdin); 
if (ret == NULL) /* deal with error */; 
chars = strlen(buffer); 

现在,两件事情之一可能已经hapenned:无论是'\n'读取之前缓冲区满了或在读取'\n'之前缓冲区已满。你可以知道这是它在缓冲区检查的最后一个字符

if (buffer[chars - 1] == '\n') /* full line read */; 
else /* incomplete line */; 

注意chars总是(*)1以上,所以表达buffer[chars - 1]是确定的。 (*)它只能使用二进制数据输入0,但会拒绝使用strlen和其他字符串函数。