2010-03-03 149 views
10

可以使用哪种方法从C中的文件一次读取一行?在C中一次读取一行

我正在使用fgets函数,但它不起作用。 它只读取空格分隔的标记。

怎么办?

+0

所以你不想读一行,你想读直到遇到一个空格?或者你是否说fgets停止空间而不是换行符? – 2010-03-03 16:06:29

+0

只应停在换行字符上。 – 2010-03-03 16:21:12

+0

这里是我的输入:: START 直流10 乙DS 20 STOP 我:: START 一个 乙 STOP 作为我的输出.. – 2010-03-03 16:21:56

回答

12

这应该工作,当你由于某种原因不能使用fgets()

int readline(FILE *f, char *buffer, size_t len) 
{ 
    char c; 
    int i; 

    memset(buffer, 0, len); 

    for (i = 0; i < len; i++) 
    { 
     int c = fgetc(f); 

     if (!feof(f)) 
     { 
     if (c == '\r') 
      buffer[i] = 0; 
     else if (c == '\n') 
     { 
      buffer[i] = 0; 

      return i+1; 
     } 
     else 
      buffer[i] = c; 
     } 
     else 
     { 
     //fprintf(stderr, "read_line(): recv returned %d\n", c); 
     return -1; 
     } 
    } 

    return -1; 
} 
+0

thanx buddy其准备工作但仍有问题.. 我的缓冲区正在读取和存储整行 ,但在打印时只有第一个空间分隔符只有 – 2010-03-03 16:36:11

+0

这很奇怪,我可以使用'printf(“%s \ n”,buffer);'它输出整个缓冲区 – LukeN 2010-03-03 16:38:30

+0

yeh, 对我来说也是很奇怪的。因为它适用于所有以前的程序...:'( – 2010-03-03 16:48:35

2

fgets()应该要走的路...

+0

只要缓冲区足够大 – Tom 2010-03-03 16:06:15

+0

汤姆:这是第二个参数的用途,以避免超出缓冲区。或者你的意思是没有预见足够大的缓冲区? IIRC,我的C编译器在各行上有512字节的限制。 – 2010-03-03 16:19:39

+0

哪个C编译器是?我正在考虑你不知道这条线路有多长的情况,例如stdin。不要试图就此开始一场神圣的战争。 – Tom 2010-03-03 16:58:31

7

fgets功能从文件中读取或num字符,其中num是传递给fgets第二个参数一行。你是否传递了足够多的数字来阅读该行?

对于实施例

// Reads 500 characters or 1 line, whichever is shorter 
char c[500]; 
fgets(c, 500, pFile); 

比。

// Reads at most 1 character 
char c; 
fgets(&c,1,pFile); 
+0

是的。 我的缓冲区长度是100. 所以我猜它足够.. – 2010-03-03 16:23:03

+0

数组变量声明不正确! – t0mm13b 2010-03-03 16:24:20

+0

@JaredPar:酷!你修好了! :P嘿,我在从0降至-1后投票赞成,然后在您纠正之后提高投票率,将其恢复为零,而不是跳到1 ...是我的浏览器还是一个小故障? – t0mm13b 2010-03-03 16:27:38

2

兼用fgets,如果你知道你的行会放入缓冲区或使用fgetc为更好地控制阅读

3

这比一个完整的答案评论,但我没有足够的点评论。 :)

这里的函数原型与fgets():

char *fgets(char *restrict s, int n, FILE *restrict stream); 

它会读取n-1个字节或最多换行或EOF。欲了解更多信息,请参阅here

2

使用fgets从读取线,然后用getc(...)咀嚼换行或结束行继续阅读....这里是永远读线的例子...

 
// Reads 500 characters or 1 line, whichever is shorter 
char c[500], chewup; 
while (true){ 
    fgets(c, sizeof(c), pFile); 
    if (!feof(pFile)){ 
     chewup = getc(pFile); // To chew up the newline terminator 
     // Do something with C 
    }else{ 
     break; // End of File reached... 
    } 
} 
16

使用以下程序从文件中逐行获取。

#include <stdio.h> 
int main (void) 
{ 
    char filename[] = "file.txt"; 
    FILE *file = fopen (filename, "r"); 

    if (file != NULL) { 
    char line [1000]; 
    while(fgets(line,sizeof line,file)!= NULL) /* read a line from a file */ { 
     fprintf(stdout,"%s",line); //print the file contents on stdout. 
    } 

    fclose(file); 
    } 
    else { 
    perror(filename); //print the error message on stderr. 
    } 

    return 0; 
} 
0

错误来源:

其实这不是我的错.. 在这种情况下。 我正在使用strtok函数,并意外修改我的原始我的原始字符串。 因此,尽管印刷我得到的错误...

谢谢大家对我的帮助.. :)

-1

可以代替用fgets的的fscanf。由于fgets fscanf用于包含空格的字符,但在使用fscanf时,您可以单独访问保存在file.eg中的数据,因此存在具有名称类别卷的文件。现在声明一个字符串和两个整数行。