我似乎不知道如何从fopen转换为open。我没有太多的c语言经验,所以这对我来说是非常难以承受的
以下是它本身的情况:
在cache_reader.c文件中(仅打开和关闭函数):
无效cr\U关闭(cr\U文件*f){
自由(f->;缓冲区);
fclose(f->;文件);
}
cr_文件*cr_打开(char*文件名,int buffersize)
{
文件*f;
if((f=fopen(文件名,“r”))==NULL){
fprintf(stderr,“无法打开%s\n”,文件名);
返回0;}
cr_文件*a=(cr_文件*)malloc(sizeof(cr_文件));
a->;文件=f;
a->;缓冲长度=缓冲大小;
a->;usedbuffer=缓冲区大小;
a->;缓冲区=(字符*)malloc(sizeof(字符)*缓冲区大小);
补充(a);
返回a;
}
在cache_reader.h文件中:
类型定义结构{
FILE*FILE;//正在读取的文件
int bufferlength;//固定缓冲区长度
int usedbuffer;//缓冲区中的当前点
char*buffer;//指向内存块的指针
//与“缓冲长度”相同的长度
}cr_文件;
//打开具有给定缓冲区大小的文件以进行缓存
cr_文件*cr_打开(char*文件名,int buffersize);
//关闭打开的文件
作废cr_关闭(cr_文件*f);
int重新填充(cr_文件*buff);
在cache_example.c文件中:
int main(){
字符c;
//打开一个文件
cr_文件*f=cr_打开(“文本”,20);
//虽然有有用的字节来自它
而((c=cr\U读取字节(f))!=EOF)
//打印出来
printf(“%c”,c);
//然后关闭文件
cr_关闭(f);
//完成
返回0;
}
我知道我需要将fclose更改为close,fopen更改为open。但我不懂其他的大部分东西。我每件事都会犯很多错误,我不确定指针是如何解决的,因为我几乎没有任何使用指针的经验。我试着使用int-fileno(FILE*stream),先说int-fd=fileno(FILE*f),然后说fd=fopen(filename,“r”)==NULL。这不起作用,我能找到的所有打开函数示例都只使用文件名,而不是字符指针来指定文件名。。。我以为只要将fclose更改为close就可以实现cr_close功能,但这也不起作用。我不确定是否也需要编辑cache_example.c文件
有人能帮我找到正确的方法来做这件事吗
来自评论
本练习的目的是保持示例代码不变,但是
重新实现其他代码以使用文件描述符而不是文件描述符
溪流。
遗憾的是,标题不必要地暴露了结构的内部,
所以这个例子需要重新编译。
您将把文件*成员更改为int。
您不会使用任何接受文件流参数的函数
标题(cache\u reader.h)应该包含此内容(而不是结构)
定义):
typedef结构cr_文件cr_文件;
源(cache\u reader.c)应包含:
struct cr\u文件
{
int文件;
int缓冲长度;
int-usedbuffer;
字符*缓冲区;
};
这将在客户机(示例)代码中提供不透明类型,并允许
您可以在不需要重新编译客户端代码的情况下更改结构
(当然,尽管您必须重新编译实现-我们
不能创造完全的奇迹)
当然,您可以让您的客户机在任何时候重新编译代码
对库的内部进行更改。
然而,从长远来看,如果你能
对库代码的更改和改进,而无需
消费者(其他程序员)重新编译他们的代码。
二进制兼容性对于大型库(如
给定平台上的标准C库。
对于这样一个小项目,这并不重要,但你需要这样做
如果你愿意的话,至少在适当的时候了解更大规模的问题
坚持以编程为职业
返工代码
请注意,我的结论是我需要一些不同的成员来支持你的建议
用例-我需要知道分配的缓冲区的大小
缓冲区中实际的数据量,以及
阅读
我将成员重命名为bufmax(您的bufferlength),bufpos(您的
usedbuffer),并添加了buflen
我为cr\u read\u byte()编写了示例代码,它可以读取文件
然而,在支持写作方面也有大量工作要做,
在文件中移动,而不是一次移动一个字节,依此类推
cache\u reader.h
#如果包含NDEF缓存(读卡器)
#定义包含的缓存读取器
类型定义结构cr_文件cr_文件;
外部cr_文件*cr_打开(char*文件名,int buffersize);
外部无效cr_关闭(cr_文件*f);
外部内部cr_读取字节(cr_文件*f);
#endif/*包括缓存和读卡器*/
cache\u reader.c
#包括“cache_reader.h”
#包括<;errno.h>;
#包括<;fcntl.h>;
#包括<;标准h>;
#包括<;stdlib.h>;
#包括<;字符串.h>;
#包括<;unistd.h>;
结构cr_文件
{
int file;//正在读取的文件
int bufmax;//固定缓冲区长度
int bufpos;//缓冲区中的当前点
int buflen;//缓冲区中的数据量
char*buffer;//指向内存块的指针
};
静态无效cr_填充(cr_文件*f)
{
如果(f->;bufpos>;=f->;buflen)
{
int nbytes=read(f->;文件,f->;缓冲区,f->;bufmax);
如果(n字节>;0)
{
f->;buflen=N字节;
f->;bufpos=0;
}
}
}
无效cr_关闭(cr_文件*f)
{
自由(f->;缓冲区);
关闭(f->;文件);
免费(f);
}
cr_文件*cr_打开(char*文件名,int buffersize)
{
int-fd;
如果((fd=open(filename,O_RDWR))<;0)
{
fprintf(stderr,“无法打开%s进行读写(%d:%s)\n”,
文件名,errno,strerror(errno));
返回0;
}
cr_文件*a=(cr_文件*)malloc(sizeof(cr_文件));
char*b=(char*)malloc(sizeof(char)*buffersize);
如果(a==0 | | b==0)
{
免费(a);
免费(b);
关闭(fd);
fprintf(stderr,“无法分配%zu字节的内存(%d:%s)\n”,
sizeof(cr_文件)+buffersize、errno、strerror(errno));
返回0;
}
a->;文件=fd;
a->;bufmax=缓冲区大小;
a->;bufpos=0;
a->;buflen=0;
a->;缓冲区=b;
返回a;
}
int cr_读取字节(cr_文件*f)
{
如果(f->;bufpos>;=f->;buflen)
cr_再填充(f);
如果(f->;bufpos>;=f->;buflen)
返回EOF;
返回f->;缓冲区[f->;bufpos++];
}
cache\u example.c
#包括“cache_reader.h”
#包括<;标准h>;
内部主(空)
{
cr_文件*f=cr_打开(“文本”,20);
如果(f!=0)
{
INTC;
而((c=cr\U读取字节(f))!=EOF)
普查尔(c);
cr_关闭(f);
}
返回0;
}
makefile
CFLAGS=-std=c11-O3-g-Wall-Wextra
LDFLAGS=
低密度脂蛋白=
FILES.c=cache\u example.c cache\u reader.c
FILES.o=${FILES.c:.c=.o}
FILES.h=cache\u reader.h
PROG1=缓存\u示例
程序=${PROG1}
所有:${PROGRAMS}
${PROG1}:${FILES.o}
${CC}[email protected]${CFLAGS}${FILES.o}${LDFLAGS}${LDLIBS}
${FILES.o}:${FILES.h}
您可以在我的SOQ(堆栈)中的GitHub上找到此代码(除了答案中显示的骨架makefile)
溢出问题)存储库中的文件
src/so-4901-1302子目录。