c语言文件操作的理解

前言

写的这些东西是记录我的学习过程,不一定是正确的。错误的欢迎指出,但希望不要喷。谢谢你们。

正文

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变量后程序不停下来。困扰了我很久,尝试了很久,最后都放弃了。但是现在它又能停下来了,现在复现不出当时的场景,再次遇到再说吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值