如何编写getLine函数使用getc

时间:2015-01-06 14:30:42

标签: c++ c visual-c++

我想从带有函数原型

的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;
}

分段错误(核心转储)

2 个答案:

答案 0 :(得分:2)

下面

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;
}

你必须传递一个预先分配的缓冲区,并且它的大小使你不会试图在缓冲区的末尾添加字符。

答案 1 :(得分:0)

用于调用我编写的函数需要

  

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;
}