如果我多次调用C的read()会发生什么?

时间:2016-01-19 01:46:22

标签: c io

文档对此非常模糊。如果我多次调用C的read()函数,我必须传递一些我希望每次都读取的字节。但我怎么知道起始指数是什么?例如:

n = read(fd, *buffer, 10) n2 = read(fd, *buffer, 10)

第一次调用read将文件描述符fd的10个字节读入buffer。但是当我再次调用它时,它会读取完全相同的内容,还是会读取 next 10个字节?我真的认为这没有意义,但我认为无法定义所需的起始索引。

2 个答案:

答案 0 :(得分:5)

操作系统跟踪文件中的“当前位置”。当您打开文件时,这将是文件的开头。每次调用read时,都会从当前位置读取一些字节,并提前当前位置。您可以使用lseek更改当前位置。

请注意,read也适用于具有当前位置的内容,例如管道和套接字。由于从那些读取将始终返回您尚未阅读的下一位数据,这使它们与文件的工作方式一致(除了您不能使用lseek)。

答案 1 :(得分:2)

read(fd, buf, len)函数将fd len引用read引用的文件描述中存储的偏移量提前。每次调用writelseek()时,操作都会在该偏移量处发生,之后偏移量会增加。您可以使用fd手动重新定位偏移量,具体取决于pread()引用的文件类型。

还有一对函数pwrite()pwrite()不会修改此偏移量,而是必须显式地向函数传递偏移量。请注意,O_APPEND在Linux上的- (void)sendRequest:(id)sender { NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:nil delegateQueue:nil]; NSString *urlString = [NSString stringWithFormat: @"https://api.outpan.com/v2/products/%@", _barcode]; NSURL *url = [NSURL URLWithString: urlString]; NSURLComponents *components = [[NSURLComponents alloc] initWithURL: url resolvingAgainstBaseURL: NO]; NSURLQueryItem *query = [[NSURLQueryItem alloc] initWithName: @"apikey" value: @"935b8b8e102f93220b751a4e1c66126a"]; components.queryItems = @[query]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: components.URL]; request.HTTPMethod = @"GET"; NSURLSessionDataTask* task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { if (error == nil) { NSDictionary *responseBody = [NSJSONSerialization JSONObjectWithData: data options: 0 error: nil]; NSLog(@"got response: %@", responseBody); } else { // Failure NSLog(@"URL Session Task Failed: %@", [error localizedDescription]); } }]; [task resume]; } 已被破坏。

有关详细信息,请阅读IEEE 1003.1,2013版(POSIX.1 2008)关于read()的内容。