您好我不知道如何在C中模拟我自己的Cat函数,我知道如果没有设置参数并且我已经得到它它是如何工作的,但我的问题是当我试图打开文件然后打印自己...
我的代码到现在为止:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
int main(int argc, char* argv[])
{
char *a1 = (char*) malloc (sizeof(char));
int sz, fd,cont=0, cont1=0;
char *b1 = (char*) malloc (sizeof(char));
//char *a2 = (char*) malloc (sizeof(char));
char * a2;
char *b2 = (char*) malloc (sizeof(char));
// NO PARAMETERS
while (argc == 1){
sz=read(0, a1, 1);
b1[cont]=a1[0];
if(b1[cont]=='\n'){
write(1,b1,cont);
write(1,"\n",1);
b1=NULL;
}
cont=cont+1;
b1=(char*) realloc(b1, sizeof(char)*cont);
}
// 1 PARAMETER (FILE) /*Here is the problem*/
if (argc > 1){
fd=open(argv[1],O_RDONLY);
a2=fgetc(fd);
while (a2 != EOF){
b2[cont1]=a2;
cont1=cont1+1;
b2=(char*) realloc (b2, sizeof(char)*cont1+1);
a2=fgetc(fd);
}
write(1,b2,cont);
b2=NULL;
close(fd);
}
return 0;
}
我该怎么办?
答案 0 :(得分:2)
如果您使用open()
和close()
,则无法使用fgetc()
。您需要使用fopen()
和fclose()
才能使用fgetc()
。
无论哪种方式,您都需要一个可以使用标准输入(拼写0
或stdin
)或打开的文件(fd
或{{1是文件描述符&#39;和文件指针的常规名称&#39;)。您也可以指定输出流。因此,例如,接口:
fp
然后,您的主程序使用标准输入和标准输出或打开的文件和标准输出调用您选择的函数。
此外,您还有:
int cat_fd(int ifd, int ofd);
int cat_fp(FILE *ifp, FILE *ofp);
忽略演员表,这是一种昂贵的写作方式:
char *a1 = (char*) malloc (sizeof(char));
您的循环一次只能读取一个字符。对于来自char a1[1];
的文件流,这是可以的,但如果您正在使用文件描述符,则对性能有害。你应该一次读取4096个字符的块。
<stdio.h>
您不需要动态内存分配;这只会让你感到困惑,并且在节目中浪费时间。 int cat_fd(int ifd, int ofd)
{
char buffer[4096];
ssize_t nbytes;
while ((nbytes = read(ifd, buffer, sizeof(buffer))) > 0)
{
if (write(ofd, buffer, nbytes) != nbytes)
return -1;
}
return (nbytes < 0) ? -1 : 0;
}
函数中的代码看起来更像是:
main()
重写使用if (argc == 1)
{
if (cat_fd(0, 1) != 0)
fprintf(stderr, "failed to copy standard input\n");
}
else
{
for (int i = 1; i < argc; i++)
{
int fd = open(argv[i], O_RDONLY);
if (fd < 0)
fprintf(stderr, "failed to open %s for reading\n", argv[i]);
else
{
if (cat_fd(fd, 1) != 0)
fprintf(stderr, "failed to copy %d to standard output\n", argv[i]);
close(fd);
}
}
}
是读者的一项练习。您可能会发现Tried and true simple file copying code in C相关。