如何编写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
根据从getc
到c
读取的内容返回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 函数中提取特定的子字符串?