现有一字符串,其中有若干'\n'换行符,返回行数据

peng_weida 2011-11-22 03:18:56
之前是逐字符处理,遇到换行符,就返回这一行的数据。
现在申请一个buffer,一次性读入指定量数据,然后寻找'\n',有没有快速定位换行符的方法呢?
...全文
317 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
peng_weida 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 qq120848369 的回复:]
引用 7 楼 peng_weida 的回复:

引用 4 楼 qq120848369 的回复:
linux区都教你办法了,自己封装一个fgets。

你还是去看看fgets是怎么设计的吧。

正在找,还没找到!
你说的那个方法,怎么快速定位'\n',


fgets不在乎\n在哪里,它是边走边看,不知道给几个人举过例子了,都懒得说了。

char *fgets(cha……
[/Quote]
给力!
ProgrammingRing 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 qq120848369 的回复:]

引用 7 楼 peng_weida 的回复:

引用 4 楼 qq120848369 的回复:
linux区都教你办法了,自己封装一个fgets。

你还是去看看fgets是怎么设计的吧。

正在找,还没找到!
你说的那个方法,怎么快速定位'\n',


fgets不在乎\n在哪里,它是边走边看,不知道给几个人举过例子了,都懒得说了。

char *fgets(ch……
[/Quote]
学习。。
qq120848369 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 peng_weida 的回复:]

引用 4 楼 qq120848369 的回复:
linux区都教你办法了,自己封装一个fgets。

你还是去看看fgets是怎么设计的吧。

正在找,还没找到!
你说的那个方法,怎么快速定位'\n',
[/Quote]

fgets不在乎\n在哪里,它是边走边看,不知道给几个人举过例子了,都懒得说了。

char *fgets(char *s, int size, FILE *stream);

看函数原型,你传s,size,fp,它给你返回一个\n结尾的行,如果size不够,那么是\0结尾的字串。

直接给你个例子,有"123456\nabcd\n" 这些东西在fp里,fp的buffer是8字节,size=5,调用fgets每次结果如下,每次调用都是fgets(s,5,fp):

1,read读给buffer8字节"123456\na",顺序复制buffer给s,到'4'之后没遇见\n,因为size=5,停止,给s[4]=0,返回s=1234\0,buffer里剩下56\na

2,buffer里还有56\na,依次拷贝给s,遇见\n,停止,返回s=56\n\0,buffer剩下a.

3, 拷贝a给s,buffer空,再次read给buffer 8字节,结果read返回4,buffer里是bcd\n 。顺序复制buffer给s,遇见\n,s返回bcd\n,buffer空。

4,buffer空,调用read给buffer8字节,结果返回0,文件eof,返回s=null.
lancerEx 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 peng_weida 的回复:]

引用 4 楼 qq120848369 的回复:
linux区都教你办法了,自己封装一个fgets。

你还是去看看fgets是怎么设计的吧。

正在找,还没找到!
你说的那个方法,怎么快速定位'\n',
[/Quote]

最快的算法也是O(n)
测试NULL 2011-11-22
  • 打赏
  • 举报
回复

#include <stdio.h>
char * ___strtok = NULL;

size_t strspn(const char *s, const char *accept)
{
const char *p;
const char *a;
size_t count = 0;

for (p = s; *p != '\0'; ++p)
{
for (a = accept; *a != '\0'; ++a)
{
if (*p == *a)
break;
}
if (*a == '\0')
return count;
++count;
}

return count;
}

char * strpbrk(const char * cs,const char * ct)
{
const char *sc1,*sc2;

for( sc1 = cs; *sc1 != '\0'; ++sc1)
{
for( sc2 = ct; *sc2 != '\0'; ++sc2)
{
if (*sc1 == *sc2)
return (char *) sc1;
}
}
return NULL;
}

char * strtok(char * s,const char * ct)
{
char *sbegin, *send;

sbegin = s ? s : ___strtok;
if (!sbegin)
{
return NULL;
}
sbegin += strspn(sbegin,ct);
if (*sbegin == '\0')
{
___strtok = NULL;
return NULL;
}

send = strpbrk( sbegin, ct);

if (send && *send != '\0')
{
*send++ = '\0';
}
___strtok = send;
return sbegin;
}

int main()
{
char whitespace[] = "\n";
char line[] = "abcdefg\nsadjlgkw\njalwkeg\njawkleg\najw\nawjklg\nawegee\n";
char *token;

token = strtok(line, whitespace);
while(token != NULL)
{
printf("%s\n", token);
token = strtok(NULL, whitespace);
}
return 0;
}
calvin_guo 2011-11-22
  • 打赏
  • 举报
回复
没有办法快速定位,如果不能用api就一个个char for它。 如果可以用api就如楼上的strtok
peng_weida 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qq120848369 的回复:]
linux区都教你办法了,自己封装一个fgets。

你还是去看看fgets是怎么设计的吧。
[/Quote]
正在找,还没找到!
你说的那个方法,怎么快速定位'\n',
ryfdizuo 2011-11-22
  • 打赏
  • 举报
回复
使用strtok分割字符串,分割的标签是 换行符
peng_weida 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wangliangffaflgh 的回复:]
啥意思? 是不是你想将"abcdefg\nsadjlgkw\njalwkeg\njawkleg\najw\nawjklg\nawegee\n"
转换为:
abcdefg
sadjlgkw
jalwkeg
jawkleg
ajw
awjklg
awegee
吗?
[/Quote]
嗯,是这样!不过不能调用fgets()函数
qq120848369 2011-11-22
  • 打赏
  • 举报
回复
linux区都教你办法了,自己封装一个fgets。

你还是去看看fgets是怎么设计的吧。
测试NULL 2011-11-22
  • 打赏
  • 举报
回复
啥意思? 是不是你想将"abcdefg\nsadjlgkw\njalwkeg\njawkleg\najw\nawjklg\nawegee\n"
转换为:
abcdefg
sadjlgkw
jalwkeg
jawkleg
ajw
awjklg
awegee
吗?
peng_weida 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gdujian0119 的回复:]
C/C++ code
char buf[1024];
FILE *fp = fopen("filepath", "r");
if(NULL == fp){
fprintf(stdout, "open file error...\n");
exit(1);
}
while(NULL != fgets(buf, sizeof(buf)-1, fp)){
fpri……
[/Quote]
先谢谢了哈!
不过,不能用fgets(),因为内核态下不能调用这个库函数;
不好意思,我没有说清楚这个问题。
孤独小剑 2011-11-22
  • 打赏
  • 举报
回复
char buf[1024];
FILE *fp = fopen("filepath", "r");
if(NULL == fp){
fprintf(stdout, "open file error...\n");
exit(1);
}
while(NULL != fgets(buf, sizeof(buf)-1, fp)){
fprintf(stdout, "%s", buf);
}
fclose(fp);

这样可以自动读取一行,如果1024不够大可再使用更大的,如果还不够,那则使用楼主自己的方法,但这个一般情况下可满足需求了。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧