我想知道如何在C中使用系统调用read()和write()。 我试图将目录中预先存在的文件的内容读入缓冲区(数组),这样我就可以逐步浏览数组并确定读取的文件类型。我已经看了很多关于此事的不同帖子,并且无法弄清楚我哪里出错了。我试图在底部打印我的缓冲区数组,以确保它保持文件的正确内容,然后单步执行以确定文件类型,但缓冲区没有任何内容。任何帮助将不胜感激。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#include <time.h>
int main(int argc, char *argv[])
{
char *currentDir = NULL;
DIR *myDir = NULL;
struct dirent *myFile = NULL;
struct stat myStat;
const void *buf [1024];
int count;
int currentFile;
if (strcmp(argv[1], "ls") == 0 && argc < 3)
{
currentDir = getenv("PWD");
myDir = opendir(currentDir);
while ((myFile = readdir(myDir)) != NULL)
{
if (myFile->d_name[0] != '.')
{
puts(myFile->d_name);
//printf("%s\n", myFile->d_name);
}
}
closedir(myDir);
}
if (strcmp(argv[1], "ls") == 0 && strcmp(argv[2], "-t") == 0)
{
currentDir = getenv("PWD");
myDir = opendir(currentDir);
while ((myFile = readdir(myDir)) != NULL)
{
if (myFile->d_name[0] != '.')
{
printf("%s\n", myFile->d_name);
stat (myFile->d_name, &myStat);
printf("Last Accessed:\t%s\n", ctime(&myStat.st_atime));
printf("Last Modified:\t%s\n", ctime(&myStat.st_mtime));
printf("Last Changed:\t%s\n", ctime(&myStat.st_ctime));
}
}
closedir(myDir);
}
if (strcmp(argv[1], "ls") == 0 && strcmp(argv[2], "-f") == 0)
{
currentDir = getenv("PWD");
myDir = opendir(currentDir);
while ((myFile = readdir(myDir)) != NULL)
{
//while (count = read(0, buf, 100) > 0)
//{
//}
//write (1, buf, 100);
//printf ("Buffer Holds:\n %s\n", buf);
if (myFile->d_name[0] != '.')
{
while (count = read(myFile->d_name, buf, 100) > 0)
write (1, buf, count);
printf ("Buffer Holds:\n %s\n", buf);
}
}
}
return 0;
}
答案 0 :(得分:1)
你需要更多的内容:
while (count = read(myFile->d_name, buf, 100) > 0)
尝试:
while ((count = read(myFile->d_name, buf, 100)) > 0)
另外,建议使用sizeof:
while ((count = read(myFile->d_name, buf, sizeof(buf))) > 0)
但您已将buf
声明为指针数组:
const void *buf [1024];
这似乎不是你真正想要的。文件中是否存有真正的指针值?我认为你可能认为buf
是一个字符数组:
char buf[1024];
答案 1 :(得分:0)
我能够弄清楚出了什么问题,我确实必须将buf数组更改为一个字符数组,但我对read是如何工作有一些误解。我虽然(select * from A union select * from B) minus (select * from A intersect select * from B)
正在从文件读取字节并将其存储到临时数组中,所以我认为我需要使用read()
将temp数组中的信息写入我指定的数组中。实际上,write()
读取指定的文件并将其内容直接存储到我的read()
数组中,因此对char buf [1024]
的调用实际上覆盖了write()
从中读取的所有信息指定文件,并存储到read()
数组中。
谢谢大家的回复,我只在这里发布了另外一次,所以我仍然想弄清楚如何解释我遇到的问题而不那么含糊不清。