【问题标题】:Read lines of file in C在C中读取文件行
【发布时间】:2019-06-18 11:23:42
【问题描述】:

我正在尝试逐行读取标准文件输入。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define BUFFER_SIZE 1204

char* readLine(char* buffer){
    int i = 0;
    for(i; i< BUFFER_SIZE; i++){
        printf("%c",buffer[i]);
        if( '\n' == buffer[i]){
            char* line[124];
            memcpy( line, &buffer[0], i-1 );
            return *line;
        }
    }
    free(buffer);
}
int doStuffWithLine(char* line){
    return 1;
}
int main(int argc, char *argv[])
{
    ssize_t aux1;
    char *buffer = malloc(sizeof(char)*BUFFER_SIZE);
    char *line = malloc(sizeof(char)*BUFFER_SIZE);
    while((read(STDIN_FILENO, buffer, BUFFER_SIZE))>0){ 
        line = readLine(buffer);
        doStuffWithLine(line);
        printf("%s", line);
    }
    return 0;
}

这是输入文件内容:

lol1
lol2
lol3

这是我的程序的输出:

lol1
Segmentation fault (core dumped)

我想知道如何阅读第 2 行和第 3 行,解决它并解释一下我做错了什么,因为我不明白这个问题。

提前谢谢你。

【问题讨论】:

  • 而不是函数readLine()中的char* line[124];,一个指针数组,我怀疑你的意思是char line[124];但是因为这是一个局部变量,你不能返回它的地址并且期望是能够访问它。您需要在main() 中创建与BUFFER_SIZE 一样大的第二个缓冲区,并将该缓冲区添加到readline() 的参数列表中,以便在您调用函数doStuffWithLine() 时该缓冲区将存在并且足够大。
  • 你在readLine的末尾释放了buffer
  • readline()free(buffer),但在下一次迭代中你再次使用缓冲区,就好像它仍然被分配一样。
  • 当您输入 read() 文本时,您没有将 NUL 终止添加到 buffer 的末尾。您需要跟踪来自 read 的返回值以了解多少读入buffer
  • char* line[124] 被声明为 readLine 本地,并且它的存储在返回时变得无效。在readLine 中分配存储空间并返回一个指向分配块的指针,或者传递一个额外的参数为line 提供所需的存储空间。

标签: c file input readline


【解决方案1】:

首先,感谢所有帮助我并花了一些时间尝试的人。

在花了几个小时学习并打破了我的大脑后,我找到了解决方案。总之,我是 ***** 和菜鸟。

如果有人遇到同样的问题,我将提交我的代码。轻松愉快:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <limits.h>

char* doStuff(char* line){
    return line;
}

int main(int argc, char *argv[])
{
    char *line = malloc(sizeof(char)*LINE_MAX);
    while(fgets(line, LINE_MAX, stdin)!= NULL)
    {
        line = doStuff(line);
        printf("%s", line);
    }
    return 0;
}

【讨论】:

  • 关于表达式:sizeof(char) C 标准将该表达式定义为始终为 1。将任何内容乘以 1 无效。它只是使代码混乱,使其更难以理解、调试等。建议删除该表达式
【解决方案2】:

函数read 读取原始字节并且不会用字符串终止字符'\0' 终止缓冲区;然后将它用于 printf("%s",...),它需要一个以 0 结尾的 C 字符串,会产生未定义的行为(例如崩溃)。

我建议改用fgets

【讨论】:

    猜你喜欢
    • 2010-12-24
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多