【发布时间】:2010-12-10 14:52:10
【问题描述】:
创建用户输入的文件副本的复制程序几乎没有问题。我决定不使用 (size_t) 结构,而是只分配 (int) 和 (char) 类型变量,因此我知道要读取()的字节的确切值。即我知道从文件开始并读取 4 个字节(int)以获取文件名的长度值,我在下一次读取()中将其用作大小
所以,当我写(复制文件完全相同的名称)用户输入文件到输出文件(复制文件)时,我用长字符串写它,显然没有空格只是为了让它在这里可读,
文件名大小文件名文件内容大小文件内容 即 10 myfile.txt 5 你好
因此,当我开始读取该数据时,我使用 lseek() 从文件开头开始,我知道前 4 个字节是 (int),它是文件名的长度,所以我使用 read 函数将其放入 value int namelen 中。
我的问题是我想使用读取的文件名大小(前 4 个字节)的值来声明我的数组以存储具有正确长度的文件名。如何将此数组放入 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 字节数来给我原始文件的文件名,这样我就可以在目录中创建复制的文件?
谢谢
【问题讨论】:
-
发布整个“复制”功能(以及引入逻辑/文件描述符/等)。看起来您的假设有些离谱(例如,为什么您认为文件的前 4 个字节包含长度?)
-
"为什么你认为文件的前 4 个字节包含例如长度?"因为他是我首先将其写入文件的人;)
-
希望您的程序永远不会在以不同方式存储整数的机器上使用。 32 位与 64 位编译将打破这一点(这就是为什么有 size_t)。但是 size_t 不能解决大端与小端的问题。
-
通过显示实际代码来解释比尝试用语言表达更清楚。在进行语言表达时,会引入很多变量,考虑到读者的不同背景,这些变量可能难以以明确的方式进行解释。