问题描述
|
#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;