我正在实现一个基本的getline()函数,用于读取文件内容并将其写入终端,然而

这完全可以用

#include<stdlib.h>
int main(int argc , char *argv[])
{
    FILE *fp = fopen(argv[argc-1],"r");
    if(fp == NULL)
    {
        printf("error : can't open file");
        exit(1);
    }
    char *buf = NULL;
    size_t linelen  = 0;
    size_t linecapp = 0;
    while((linelen = getline(&buf,&linecapp,fp)) !=-1)
    {
        fwrite(buf,linelen,1,stdout);
    }
    fclose(fp);
    return 0;
}

但这

#include<stdio.h>
#include<stdlib.h>
int main(int argc , char *argv[])
{
    FILE *fp = fopen(argv[argc-1],"r");
    if(fp == NULL)
    {
        printf("error : can't open file");
        exit(1);
    }
    char *buf = NULL;
    size_t linelen  = 0;
    size_t linecapp = 0;
    while((linelen = getline(&buf,&linecapp,fp)) >= 0)
    {
        fwrite(buf,linelen,1,stdout);
    }
    fclose(fp);
    return 0;
}

正在给出分段错误. 唯一不同的是 while循环中的!= -1 and >= 0是一样的.

What I tried printf("%zu\n", linelen); 在我的while循环中,我得到了这个 <\n\n>

116
hello world this is a test file to bes used for the purpose of learning basics of unix sys calls and c programming 
77
this is just an extra line to elongate the file followed by more extra lines
55
for example this is a line used in elongating the file
22
this is another line 
141
this line contain special characters like œ∑´®†¥¨ˆøπåß∂ƒ©˙∆˚¬¬¬…≈ç√∫˜µ≤≥÷¡™£¢∞§¶•ªº–
52
this line contain some numbers 1 2 3 5 7 4 6 8 9 10
18446744073709551615
his line contain some numbers 1 2 3 5 7 4 6 8 9 10
?¥¨ˆøπåß∂ƒ©˙∆˚¬¬¬…≈ç√∫˜µ≤≥÷¡™£¢∞§¶•ªº–
Xjm??ͫ?????@|m? ?5?r?@?@:?#??Zm@?` `@?`?`?Zm???#? ??#????#?????#?@?`X???\/var/folders/l5/h45_tftn3w18ws8vshrpxlsr0000gn/T//private/tmp/com.apple.launchd.pIOsn5DWl2/Listeners0?``SSH_AUTH_SOCK??`??????????????????`??`P ?b??,?,?8Zm@??Xm? ??`(?`?`HOME?Xm?D<?B`38?`P`PATH?Xm?81??` ?`?`TMPDIR?Xm?83?`??!???c?8???W&???ǀ?G???w+???C???????`??`@``?```?Z??`ԥ`???`???`???`?@`?a??\_?x?`?`?`?Z????^??\_?x?`????`?pm??   ??
m ??um??     ?x ?h
m?
 ?@
m?? ??
m?`
 ??
zsh: segmentation fault  ./getlinefunc ../../sampletextfile.txt

为了进行比较,这里是原始样本文本文件

hello world this is a test file to be used for the purpose of learning basics of unix sys calls and c programming 
this is just an extra line to elongate the file followed by more extra lines
for example this is a line used in elongating the file
this is another line 
this line contain special characters like œ∑´®†¥¨ˆøπåß∂ƒ©˙∆˚¬¬¬…≈ç√∫˜µ≤≥÷¡™£¢∞§¶•ªº–
this line contain some numbers 1 2 3 5 7 4 6 8 9 10

它最终为linelen带来了非常大的价值.

推荐答案

变量linelen是无符号的,因此它大于或等于零的always.

documentation个州:

出现错误时,返回-1并在流中设置feof或fersor.

-1进行相等性测试有效,因为当分配给无符号值时,负返回值会自动转换为其无符号等效值,然后当与无符号值进行比较时,-1会自动转换为无符号.

这里的实际问题是getline的返回类型是ssize_t,这是size_t值的签名版本.因此,您应该使用适当的类型,那么循环的两个版本都可以工作:

char *buf = NULL;
ssize_t linelen  = 0;
size_t linecapp = 0;
while((linelen = getline(&buf,&linecapp,fp)) >= 0)
{
    fwrite(buf,linelen,1,stdout);
}
free(buf);

C++相关问答推荐

初始化char数组-用于初始化数组的字符串是否除了存储数组的位置之外单独存储在内存中

CC crate 示例不会与C函数链接

为什么在4.9.37版的内核中,kfio还需要smp_wmb呢?

当execvp在C函数中失败时杀死子进程

为什么sscanf不能正确地从这个字符串格式中提取所有数字?

如何在不使用其他数组或字符串的情况下交换字符串中的两个单词?

X86/x64上的SIGSEGV,由于原始内存访问和C中的DS寄存器之间的冲突,在Linux上用TCC编译为JIT引擎

Clang警告称,`ffi_type`与`sizeof`不兼容

在循环中复制与删除相同条件代码的性能

如何在C中使数组变量的值为常量?

如何读取文件并将内容保存在字符串中?(在C语言中,没有崩溃或核心转储错误)

收到不兼容的指针类型警告,因为函数的返回不是空*,而是 struct 指针

Fprintf正在写入多个 struct 成员,并且数据过剩

从C中的函数返回静态字符串是不是一种糟糕的做法?

在吉陀罗中,_2_1_和CONCAT11是什么意思?

如何在C中定义指向函数的指针并将该指针赋给函数?

如何使用calloc和snprintf

将某些内容添加到链接列表时,列表中的其他项将使用最后添加的项的名称

用C++初始化局部数组变量

DennisM.Ritchie的C编程语言一书中关于二进制搜索的代码出现错误?