Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用fgets检测C中的下线_C_File Io - Fatal编程技术网

使用fgets检测C中的下线

使用fgets检测C中的下线,c,file-io,C,File Io,我正在尝试使用以下命令从文件中读取一行 while(fgets(c,BUF,f) != EOL){ puts(c); } 其中EOL=define EOL'\n'然而,我得到了警告。。。指针与整数的比较 实现我所尝试的正确方法是什么?fgets读取字符串,结果类型为char* 我想您应该考虑的是fgetc?fgets读取一个字符串,结果类型是char* 我认为您应该考虑fgetc?您需要取消对返回字符*的引用,并将其与您的EOL进行比较。。。不将实际指针地址本身与行尾字符进行比较 将

我正在尝试使用以下命令从文件中读取一行

 while(fgets(c,BUF,f) != EOL){
   puts(c);
 }
其中EOL=define EOL'\n'然而,我得到了警告。。。指针与整数的比较


实现我所尝试的正确方法是什么?

fgets读取字符串,结果类型为char*


我想您应该考虑的是fgetc?

fgets读取一个字符串,结果类型是char*


我认为您应该考虑fgetc?

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

将代码更改为:

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

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

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

将代码更改为:

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

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

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

for (;;) { if (fgets(c, BUF, f) == NULL) { /* handle error */ } if (strchr(c, EOL) != NULL) { puts(c); } else {break; } }
在调用fgets后,必须检查c的内容,以确定返回的字符串中是否包含换行符:

for (;;) { if (fgets(c, BUF, f) == NULL) { /* handle error */ } if (strchr(c, EOL) != NULL) { puts(c); } else {break; } } fgets从流中读取字符并将其写入缓冲区,直到缓冲区几乎满或找到“\n”,如果操作失败,则返回NULL

因此,您可以知道读取了多少个字符,包括带有strlen的“\n”

现在,可能出现了两种情况之一:要么在缓冲区满之前读取了“\n”,要么在读取“\n”之前缓冲区已满。通过检查缓冲区中的最后一个字符,可以知道是哪个字符

if (buffer[chars - 1] == '\n') /* full line read */;
else /* incomplete line */;
注意,chars总是*1或更多,因此表达式缓冲区[chars-1]是正常的

*它可以是0,只能输入二进制数据,但这会拒绝使用strlen和其他字符串函数。

fgets从流中读取字符并将其写入缓冲区,直到缓冲区几乎满了或找到“\n”为止。如果操作失败,它将返回NULL

因此,您可以知道读取了多少个字符,包括带有strlen的“\n”

现在,可能出现了两种情况之一:要么在缓冲区满之前读取了“\n”,要么在读取“\n”之前缓冲区已满。通过检查缓冲区中的最后一个字符,可以知道是哪个字符

if (buffer[chars - 1] == '\n') /* full line read */;
else /* incomplete line */;
注意,chars总是*1或更多,因此表达式缓冲区[chars-1]是正常的


*它可以是0,只能输入二进制数据,但这会拒绝使用strlen和其他字符串函数。

为什么不试试fgetc呢?然后您可以像这样比较“/n”的ASCII代码

while (fgetc (file) != '\n'){
  puts(c);
}

你为什么不试试fgetc呢?然后您可以像这样比较“/n”的ASCII代码

while (fgetc (file) != '\n'){
  puts(c);
}