如何编写getLine函数使用getc

Posted

技术标签:

【中文标题】如何编写getLine函数使用getc【英文标题】:how to write getLine function uses getc 【发布时间】:2015-01-06 14:30:42 【问题描述】:

我想用函数原型从 txt 文件中获取行

int getLine(FILE* ptr,char* buffer);

但是我有一个堆栈问题...

int getLine(FILE* ptr,char* buffer)
int c;
while ( c = getc(ptr) != EOF && c != '\n')
    *buffer++ = c;
    
*buffer = '\0';
return 1;

分段错误(核心转储)

【问题讨论】:

你讨厌括号吗? :) while ( c = getc(ptr) != EOF && c != '\n') -> while (((c = getc(ptr)) != EOF) && (c != '\n'))。你怎么知道buffer 适合角色? 我认为没有必要在每个表达式周围加上括号。然而,有必要将它们写在getc 周围,分配为(c = getc(ptr) != EOF)0/1 分配给c 并返回等效的布尔值,而(c = getc(ptr)) != EOF 根据从getcc 读取的内容返回true/false . 由于运算符优先级,写(c = getc(ptr)) != EOF比较重要。 我的代码有什么问题? 是的,看我的回答。 【参考方案1】:

这里

c = getc(file) != EOF

你正在分配比较的结果

getc(file) != EOF

c,就像你这样做

c = (getc(file) != EOF)

所以你应该加上括号,因为operator precedence,所以更正的代码是

while ((c = getc(ptr)) != EOF && c != '\n')

您还应该确保不会将传递给函数的 char *buffer 写过去,因此传递它的大小,然后迭代直到找到 '\n' 或直到没有更多空间为止。

建议

int getLine(FILE* file, char* buffer, size_t size)

    int    c;
    size_t count;
    if (buffer == NULL)
        return 0;
    while ((size < count - 1) && ((c = getc(file)) != EOF) && (c != '\n'))
    
        *buffer++ = (char)c;
        count++;
    
    *buffer = '\0';
    return 1;

您必须传递一个预先分配的缓冲区,它的大小是为了防止尝试在缓冲区末尾添加字符。

【讨论】:

【参考方案2】:

调用我写的函数需要是

char strName[30];

而不是

char* strName;

所以需要预先分配缓冲区... 并通过

调用
getLine(fp,strName);

而 fp 是 FILE*

int getLine(FILE* ptr,char* buffer)
int c;
while (((c = getc(ptr)) != EOF) && (c != '\n'))
    *buffer++ = c;
    
*buffer = '\0';
return 1;

【讨论】:

以上是关于如何编写getLine函数使用getc的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C++ 中的 getline 函数中提取特定的子字符串?

如何编写一个 Haskell 程序来打印指定数字的素数?

如何在不使用 getline 的情况下在 C++ 中将输入字符串直到行尾

C++ 类中的 Getline

使用 C 的 getline() 时的奇怪行为

如何使用 sqlalchemy 编写自己的聚合函数?