Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取C语言中的文件行_C_File_Input_Readline - Fatal编程技术网

读取C语言中的文件行

读取C语言中的文件行,c,file,input,readline,C,File,Input,Readline,我试图逐行读取标准文件输入 这是我的代码: #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

我试图逐行读取标准文件输入

这是我的代码:

#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
Segmentation fault (core dumped)
我想知道如何阅读第2行和第3行,解决它,并解释一下我做错了什么,因为我不理解这个问题

提前感谢。

函数读取原始字节,不会使用字符串终止字符“\0”终止缓冲区;然后将其用于printf%s,…,它需要一个以0结尾的C字符串,产生未定义的行为,例如崩溃


我建议改用fgets。

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

在花了几个小时学习和打破我的大脑后,我找到了一个解决办法。总之,我是******和努布

如果有人遇到同样的问题,我将提交我的代码。简易豌豆:

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

而不是字符*行[124];在函数readLine(指针数组)中,我猜想您指的是字符行[124];然而,由于这是一个局部变量,您不能返回它的地址并期望能够访问它。您需要在main中创建一个与buffer_SIZE一样大的第二个缓冲区,并将该缓冲区添加到readline的参数列表中,以便在调用函数doStuffWithLine时该缓冲区将存在,并且将变大。您在readline的末尾释放缓冲区在readline中释放缓冲区,但在下一次迭代中,您再次使用缓冲区,就好像它仍然被分配一样。当您读入文本时,您不会将NUL终止添加到缓冲区的末尾。您需要跟踪read的返回值,以了解bufferchar中读取了多少内容。行[124]被声明为readLine的本地,其存储在返回时变为无效。在readLine中分配存储并返回一个指向已分配块的指针,或者传递一个额外的参数,为该行提供所需的存储。关于表达式:sizeofchar,C标准将该表达式定义为始终为1。任何东西乘以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;
}