3

如果我做 :

int main(){
    const int LENGTH_LINE = 100;
    char line[LENGTH_LINE];
    int len;
    FILE* fp = fopen(file.txt,"r");

    fgets(line,LENGTH_LINE,fp);
    len = strlen(line);
    if(line[len-1] == '\n')
       printf("I've a line");

    //This work if the line have \n , but if the end line of the text dont have \n how can do it?


}

我需要知道我是否采取了整行,fgets因为我有一个分隔符。

4

4 回答 4

4

根据http://en.cppreference.com/w/c/io/fgets

Reads at most count - 1 characters from the given file stream and stores them in str. 
Parsing stops if end-of-file occurs or a newline character is found, in which case str will contain that newline character.

所以,一旦 fgets 返回,就有 3 种可能性

  1. 已达到 LENGTH_LINE
  2. 我们有一个换行符
  3. 已达到 EOF。

我假设您在案例 2 和 3 中有一条线。

在这种情况下,检测条件为:

line[len-1] == '\n' || feof(fp)
于 2012-08-22T20:34:55.217 回答
1

检查换行符:

size_t len = 0;

// ... your code using fgets

len = strlen(line);
if ((len > 0) && (line[len - 1] == '\n'))
    // your input contains the newline

通话结束后fgets,如果出现以下情况,您的线路末尾可能没有换行符:

  • 在扫描换行符之前达到字符限制 - 在您的情况下是LENGTH_LINE.
  • EOF在换行符之前到达文件结尾 ( )。
  • 有一个读取错误,但如果发生错误,请考虑line不可用的内容。

您应该查看 from 的返回值,fgets以便能够处理EOF:在文件结束或读取错误时fgets返回。NULL您可以使用它feof来检查文件结尾。

如果您检查feof,并且知道您在输入的末尾没有fgets错误,那么即使最后一行没有换行符,您也会知道您已经阅读了整行。

如果由于某种原因您必须有一个换行符来终止每个line,您可以自己添加它:

// you've checked for EOF and know this is your final line:
len = strlen(line);
if (line[len-1] == '\n')
    printf("I've a line");
else if ((len + 1) < LENGTH_LINE)
{
    line[len] = '\n';
    line[len + 1] = '\0';
}
else
    // no room in your line buffer for an add'l character
于 2012-08-22T19:31:12.630 回答
0

像这样使用

while(fgets(line,LENGTH_LINE,fp)!=EOF)
  // your code here
于 2012-08-22T19:49:36.303 回答
0

为什么不直接使用 fgetc 呢?这样您就可以一直扫描直到到达行尾,这样您就不必检查是否有它。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char line[100]; 
    int ch, i = 0;

    FILE* fp = fopen(file.txt,"r");
    while(ch != '\n' || ch != '\r' || ch != EOF)  //or ch != delimiter
    {
        ch = fgetc(fp);
        line[i] = ch;
        i++;
    }
    line[i] = '\n';
    line[i+1] = 0x00;
    return 0;
}

在该示例中,我只是查找换行符、回车符或 EOF 字符,但您确实可以让它查找您喜欢的任何内容(例如,您的分隔符)。所以如果你的分隔符是q你会做

while(ch != 'q')...

于 2012-08-22T20:24:03.610 回答