我有一个“文件”作为资源。我只能使用read()
,write()
和fstat()
。这个文件是我要解析的文本文件。
通常我使用fgets()
逐行读取文本文件并解析它。在这种情况下我该怎么做?
FILE *fp;
char buffer[128];
fp = fopen( "/home/txtfile", "r" );
if (fp == NULL){
perror("file missing");
}
while (fgets (buffer, sizeof(buffer), fp) != NULL) {
//some code
}
我如何对read()
执行相同操作?
这是对的吗?
int fd = open("/dev/file",O_RDONLY);
if (fd==-1) {
printf("Failed to open file!!!\n");
}
while (fgets (buffer, sizeof (buffer), fd) != NULL) {
//some code
}
答案 0 :(得分:1)
这样的事情:
int fd = open("/dev/file",O_RDONLY);
ssize_t res = 0;
while((res = read(fd, buffer, sizeof(buffer))) > 0) {
//some code
}
if (res < 0) {
//handle error
} else{
//close fd
}
答案 1 :(得分:1)
除非您的文件很大,否则如果您正在使用read(),那么在整个文件中读取将更容易,然后在内存缓冲区上操作,而不是在离散块中操作。也就是说,除非每一行都是固定长度。
我会做这样的事情:
int rc;
int fd = open("data", O_RDONLY); // open the file for reading
if (fd == -1) {
// error
}
// to be thorough, do a stat() here to find how big to make the buffer
struct stat sb;
rc = fstat(fd, &sb);
if (rc == -1) {
// error
}
char *buffer = calloc(1, sb.st_size);
int bytes_read = 0;
// read in entire file; each read() can be incomplete, hence why it's in a loop,
// and reading from/writing to increasing sections of the memory and file
while ((rc = read(fd, (buffer + bytes_read), (sb.st_size - bytes_read))) > 0) {
if (rc == -1) {
// error
}
bytes_read += rc;
}
close(fd);
// Now, to read it line-by-line...
char line[128]; // 128 is arbitrary
int pos = 0;
while ((rc = sscanf(buffer + pos, "%127[^\n]\n", line)) > 0) {
pos += strlen(line) + 1;
// do stuff with line
}
return 0;
然后,您可以通过扫描换行符或使用sscanf()逐行操作内存缓冲区。还要确保释放()你的缓冲区!
编辑:我添加了一些使用sscanf()来处理缓冲区的示例代码。如果你知道行的格式(你说你正在解析它们),你可以通过使用格式说明符更好地使用sscanf()。顺便说一下,所有这些都是未经测试的。
答案 2 :(得分:0)
这是对的吗?
没有
read()是一个系统调用,它在Unix文件描述符上运行,而不是stdio FILE*
。除此之外,它的工作原理是从文件中读取数据并将其放入您提供的缓冲区中。
int fd = open("/dev/file",O_RDONLY);
if (fd==-1)
{
printf("Failed to open file!!!\n");
}
else
{
char buffer[BUF_SIZE];
ssize_t bytesRead = read(fd, buffer, BUF_SIZE);
while (bytesRead > 0)
{
// do something with the buffer
bytesRead = read(fd, buffer, BUF_SIZE);
}
if (bytesRead == -1)
{
// error
}
// bytesRead == 0 => end of file
}