c将read()和write()内容编程到文件中

用户应在命令行中输入一些文件名,程序将从argv[]数组中读取每个文件名。 我必须执行错误检查等。

我想读取每个文件名。 例如,如果argv [2]是’myfile.txt’,程序应该读取’myfile.txt’的内容并将值存储在char buffer[BUFSIZ] ,然后将buffer的内容写入另一个文件。

但是在编写内容之前,程序还应该写入文件名和大小。 这样可以在以后轻松提取文件。 有点像tarfunction。

我写buffer内容的文件,取决于用户添加的文件数,应该是一个字符串,如:

 myfile.txt256Thisisfilecontentmyfile2.txt156Thisisfile2content.............. 

我的问题是

1)如何使用write()语句将argv[2]write()文件,因为在编写char数组时遇到问题,我应该把什么(sizeof(?))放在write() 。 请参阅下文,因为我不知道用户输入的文件名的长度。

2)我是否使用’&’在名称后将整数值写入文件,例如在文件名后写入4个字节作为文件大小

这是我写的代码,

 char buffer[BUFSIZ]; int numfiles=5; //say this is no of files user entered at command open(file..... lseek(fdout, 0, SEEK_SET); //start begging of file and move along each file some for loop for(i=0-; ...... //for each file write filename,filesize,data....filename,filesize,data...... int bytesread=read(argv[i],buffer,sizeof(buffer)); write(outputfile, argv[i], sizeof(argv)); //write filename size of enough to store value of filename write(outputfile, &bytesread, sizeof(bytesread)); write(outputfile, buffer, sizeof(buffer)); 

但是代码没有像我预期的那样工作。

有什么建议?

由于argv由以null结尾的数组组成,因此可以编写的长度是strlen(argv[2])+1来写入参数和null终止符:

 size_t sz = strlen (argv[2]); write (fd, argv[2], sz + 1); 

或者,如果您希望长度后跟字符,您可以编写从strlen返回的size_t本身,后跟那么多字符。

 size_t sz = strlen (argv[2]); write (fd, &sz, sizeof (size_t)); write (fd, argv[2], sz); 

您可能还需要编写文件的长度,以便在读取时可以找到下一个文件。

1.,您可以通过以下方式编写字符串:

 size_t size = strlen(string); write(fd, string, size); 

但是,大部分时间并不是这么简单:你需要字符串的大小,这样你才能知道你需要阅读多少。 所以你也应该写字符串大小。

2.,整数可以通过以下方式编写:

 write(fd, &integer, sizeof(integer)); 

这很简单,但如果您打算在不同的体系结构上使用该文件,您还需要处理字节序。

听起来你最好的选择是使用二进制格式。 在您的示例中,文件名为myfile.txt ,内容长度为256,或myfile.txt2 ,内容长度为56,或myfile.txt25 ,内容长度为6? 没有办法区分文件名的结尾和内容长度字段的开头。 类似地,无法区分内容长度的结束和内容的开始。 如果必须使用文本格式,固定宽度字段将有助于此。 即32个字符的文件名后跟6个内容长度的数字。 但二进制格式更有效。

你使用strlen()得到文件名长度,不要使用sizeof(argv)因为你会得到完全错误的结果。 sizeof(argv[i])也会给出错误的结果。

因此,写入4个字节的文件名长度,然后写入文件名,然后写入4个字节的内容长度,后跟内容。

如果您希望格式可移植,则需要了解字节顺序问题。

最后,如果文件不能全部适合您的缓冲区,那么您就被塞满了。 您需要先获取正在读取的文件的大小,然后将其写入输出文件,然后确保从第一个文件读取该字节数到第二个文件。 有各种技术可以做到这一点。

谢谢回复家伙,

我决定不使用(size_t)结构而只是分配(int)和(char)类型,所以我知道read()out的字节的确切值。 即我知道从文件的开始读取并读取4个字节(int)以获取文件名长度的值,我将其用作下一个read()中的大小

所以,当我正在写(用同名复制文件)时,用户输入文件到输出文件(复制文件)我用长字符串写,没有空格显然只是为了让它在这里可读,

filenamesize filename filecontentsize filecontent即10 myfile.txt 5 hello

因此,当我读取数据时,我开始使用lseek()开始文件,我知道前4个字节是(int),这是文件名的长度,所以我使用read函数将其放入值int namelen。

我的问题是我想使用为filenamesize(前4个字节)读取的值来声明我的数组以正确的长度存储文件名。 如何将此数组放入read()中,以便read将值存储在指定的char数组中,请参阅下面的内容

 int namelen; //value read from first 4 bytes of file lenght of filename to go in nxt read() char filename[namelen]; read(fd, filename[namelen], namelen);//filename should have 'myfile.txt' if user entered that filename 

所以我的问题是,一旦我读到文件中的前4个字节给我长度存储在namelen中的文件名,然后我想读取namelen的字节数给我原始文件的文件名,这样我就可以在目录中创建复制文件了?

谢谢