使用getdelim

问题描述

|
#include<stdio.h>
#include<stdlib.h>
main()
{
FILE *fp;
char *lineptr = NULL;
size_t len;
size_t read;
fp = fopen(\"test.txt\",\"r\");
if(NULL == fp)
{
exit(1);
}
while((read=getdelim(&lineptr,&len,33,fp))!= -1)
{
    printf(\"%s\",lineptr);
}
free(lineptr);
}
在test.txt我写
before giving tab !after tab has been given
我已经设定 !作为定界符,但我看不到getline和getdelim在getdelim中有任何区别,我可以设置delimter,但在getline的情况下,它是换行符,我希望o / p为
 before giving tab
 after tab has been given
!应该被当作定界符,我如何使用getdelim做到这一点     

解决方法

        这未经测试,但是尝试更改您的printf行,因此您可以看到区别:
printf(\"%s\\n\",lineptr);
    ,        它的功能完全符合您的想象,只是它打印的第一个字符串是
before giving tab !
没有新行,后跟
after tab has been given
更改为
printf(\"%s\\n\",lineptr);
    ,        工作正常(并按您的要求定界\'!\');唯一的问题是,在while循环中,您要完全按照输入的单个字符串打印出来。 请记住:getdelim在字符串中包含定界符(它不会为您删除\'!\')。 对于给定的测试用例,第一次绕循环将给出字符串
\"before giving tab !\"
,第二次绕循环将给出字符串
\"after tab has been given\"
。您将它们都打印出来,没有任何换行符或任何内容,因此您的输出看起来与输入相同。我建议您在每个字符串之后打印换行符,但这不会摆脱\'!\'。因此,您可能需要将打印代码更改为:
while((read=getdelim(&lineptr,&len,33,fp))!= -1)
{
    if (lineptr[strlen(lineptr)-1] == \'!\')
        lineptr[strlen(lineptr)-1] = \'\\0\';
    printf(\"%s\\n\",lineptr);
}
    ,        
char before[256],after[256];

fscanf(fp,\"%255[^!]!%255[^\\n]\",before,after);
printf(\"%s\\n%s\",after);
    ,        参见
man getdelim
。字符串中包含delim,后跟一个空字符。如果要打印一个字符串,然后加上EOL,则puts是最快的方法。
puts(lineptr);
如果您还想删除delim \'!\',则在puts之前添加它。
lineptr[read - 1] = 0;
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...