如何知道C中的行结尾

时间:2012-08-22 19:30:09

标签: c

如果我这样做:

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 个答案:

答案 0 :(得分: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。
  4. 我假设你在案例2和3中有一条线。

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

    line[len-1] == '\n' || feof(fp)
    

答案 1 :(得分: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无法使用的内容。

您应该查看fgets的返回值,这样您就可以在文件结束时处理EOFfgets返回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

答案 2 :(得分:0)

像这样使用

while(fgets(line,LENGTH_LINE,fp)!=EOF)
  // your code here

答案 3 :(得分: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')...