使用getdelim

时间:2011-06-14 13:09:47

标签: c

#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

我已经定了!作为分隔符,但我没有看到getdelim中的getline和getdelim之间的任何区别我可以设置分隔符但是在getline的情况下它是换行符,我希望o / p是

 before giving tab
 after tab has been given

!应该作为分隔符如何使用getdelim

来做到这一点

5 个答案:

答案 0 :(得分:5)

这未经过测试,但尝试更改printf行,因此您可以看到差异:

printf("%s\n",lineptr);

答案 1 :(得分:3)

它正是你所想的那样,只是它打印的第一个字符串是

before giving tab !

没有新行,后跟after tab has been given

将您的打印更改为

printf("%s\n",lineptr);

答案 2 :(得分:1)

它工作得很好(并根据您的要求划分'!');唯一的问题是你在一个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);
}

答案 3 :(得分:0)

char before[256], after[256];

fscanf(fp, "%255[^!]!%255[^\n]", before, after);
printf("%s\n%s", before, after);

答案 4 :(得分:0)

请参阅man getdelim。 delim包含在字符串中,后跟一个空字符。如果你想打印一个后跟EOL的字符串,puts是最快的方法。

puts(lineptr);

如果你还想删除delim'!',请在puts之前添加。

lineptr[read - 1] = 0;