c - 如何通过使用C中的系统调用来缓冲文件中的行?

标签 c

我的方法是:

int linesize=1
int ReadStatus;
char buff[200];
ReadStatus=read(file,buff,linesize)
while(buff[linesize-1]!='\n' && ReadStatus!=0)
{
   linesize++;
   ReadStatus=read(file,buf,linesize)
}

这个主意对吗?
我认为我的代码效率有点低,因为运行时间是O(FileWidth);但是我认为如果我们以指数方式增加行大小以找到换行符,则可能是O(log(FileWidth))。
你怎么认为?
....
我刚看到一个新问题第二行怎么读?。是否还有分隔字节的方法?

最佳答案

这个主意对吗?
不。在西格扎的评论中,有一个问题的摘要:
1)read不读取行,只读取字节没有理由buff以结束。
此外,buff没有理由不包含多个换行符,而且由于这里没有[posix]标记,因此没有理由建议read做什么,更不用说它是否是一个系统调用了假设您引用的是POSIX函数,则没有错误处理你处理the return value/s reserved for errors的逻辑在哪里?
我认为我的代码效率有点低,因为运行时间是O(FileWidth);但是我认为如果我们以指数方式增加行大小以找到换行符,则可能是O(log(FileWidth))。
如果你解决了上面提到的问题(稍后会有更多的内容),如果你要测试这个理论,你可能会发现,同样在Siguza评论的核心,
磁盘通常以512字节为单位工作,文件系统缓存甚至CPU/内存缓存都比这个大得多。
在某种程度上,您可以期望您的想法接近O(log n),但您的瓶颈将是其中一条缓存线(可能是最接近键盘/文件系统/向流提供信息的缓存线)在这一点上,你应该停止浪费其他程序可能需要的内存,因为你的优化变得越来越不有效。
你怎么认为?
我觉得你应该停下来你猜对了!
一旦你写了你的程序,决定它是否太慢如果不是太慢,就不需要优化,而且你可能没有足够的纳秒来让优化变得有价值。
如果要减速,则应:
使用探查器确定最重要的瓶颈是什么,
根据你的分析程序告诉你的应用优化,然后
再次使用您的分析器,使用与以前相同的输入,以测量您的优化所产生的效果。
如果您不使用剖析器,您的猜测工作可能会导致代码变慢,或者您可能会错过进行更重要优化的机会。。。
第二行怎么读?
很自然,一个字一个字地读,而不是一次读两百个字是有意义的,因为当你读到一个以行结尾的字符时,没有其他方法可以停止阅读。
还有什么可以分隔字节的吗?
对。使用的最合理的工具是由C标准提供的,系统调用是根据标准库开发人员决定的配置(他们在这方面可能比您做得更好)自动管理的,以获得最高的效率这些工具包括:
fgets尝试读取行(一次读取一个字符),达到阈值(缓冲区大小)您可以决定一行应该有多大,因为通常情况下,您不会期望用户/程序输入大行。
strchrstrcspn从缓冲区内检测换行,以确定是否读取完整行。
scanf("%*[^\n]");在检测到不完整行的剩余部分时,将其丢弃。
realloc要重新分配缓冲区,如果您决定要调整缓冲区的大小,并再次调用fgets以检索更多数据,而不是丢弃剩余的数据注意:这将对代码的运行时复杂度产生影响,而不是我认为您应该关心这一点。
前三个选项还有其他选项你可以像我一样使用fgetc(甚至一次使用read一个字符),例如。。。
事实上,这个答案与你的问题高度相关,因为它确实试图以指数形式增加问题的规模我又写了一个例子。
应该指出的是,解决这些问题的原因并不是太多的优化,而是需要读取一个很大但大小不一的内存块记住,如果你还没有写代码,你很可能不知道优化它是否值得!
可以说,这不是你应该尝试减少依赖的read函数,而是malloc/realloc/calloc函数那才是真正的踢球者如果你真的不需要存储整条线路,那就不要!

关于c - 如何通过使用C中的系统调用来缓冲文件中的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43289161/

相关文章:

python - 将文件转换为静态 C 字符串声明

c - 尝试使用 pthread_create 时出错

C动态数组中间插入

c - 尝试存储指针数组

c - malloc(0) 返回什么?

c - 不打印句子中前三个单词的指针

函数声明文件中需要 C 头指令吗?

c++ - 通过gethostbyname获取解析的IP和TTL值

c - 数组在 C 中给出不同的输出?

python - 用 C 编写的函数真的不能有 **kwargs 参数吗?