前言
写的这些东西是记录我的学习过程,不一定是正确的。错误的欢迎指出,但希望不要喷。谢谢你们。
正文
c语言的文件操作提供的库函数想到少,fopen返回文件指针(FILE),相应的系统级api操作相对比较多。open返回的是文件描述符(实际为一个整数,向socket一样是个整数),相应的api比较少,我目前看到只有read,write。当时我觉得一定有readline的api,结果搜索了半天没找到。自己实现时,受到网络编程的影响,网络里的read如果没有东西是会阻塞不返回直到有东西来,那么读普通文件会不会阻塞,又去实验了一下,得到的结论是read函数读普通文件不会阻塞。当read函数返回0是说明读eof了。下面是我的实验代码。
read函数的头文件是<unistd.h>
open函数的头文件是<fcntl.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdio.h>
int readline(int fd,char* data,int bufsize)
{
int i=0;
int status;
char buf;
while(1)
{
if(i<=bufsize-2)
{
status=read(fd,&buf,1);
if(status==0)
{
return -1;
}
else if(status==-1)
{
return -2;
}
else
{
if(buf=='\r')
{
continue;
}
else if(buf=='\n')
{
break;
}
else
{
data[i++]=buf;
}
}
}
else
{
break;
}
}
data[i]=0;
return i;
}
int main()
{
int fd;
unsigned char buf;
char data[100];
int status=1;
int i=0;
fd=open("test.txt",O_RDONLY);
while((status=readline(fd,data,100))>=0)
{
printf("size:%d data:%s\n",status,data);
}
}
当时调试时遇到了一个bug。是这行错误代码导致的:
status=(readline(fd,data,100)>=0),
正确的应该是
while((status=readline(fd,data,100))>=0)
代码编写错误导致的现象是
//test.txt文件内容
1
2
3
45
6
输出:
这里不正常,size应该为2。
用gdb调试。
这里推荐一个gdb使用上的技巧,你可以在gdb时输入-tui参数,gdb ./a.out -q -tui
得到的效果就是这样
另外一个技巧是watch 变量。
如果一个变量被watch了,那么当这个变量被修改的时候,程序会停下来。就像打了断点一样。
比如我断点打在了函数的开头,然后watch这个函数的一个局部变量i。然后c让程序继续运行。程序会停在34行。i++位置处。
当时不知道怎么的watch变量后程序不停下来。困扰了我很久,尝试了很久,最后都放弃了。但是现在它又能停下来了,现在复现不出当时的场景,再次遇到再说吧。