如果我这样做:
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
采取了整行,因为我有一个分隔符。
答案 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种可能性
我假设你在案例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
的返回值,这样您就可以在文件结束时处理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
答案 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')...