文档对此非常模糊。如果我多次调用C的read()
函数,我必须传递一些我希望每次都读取的字节。但我怎么知道起始指数是什么?例如:
n = read(fd, *buffer, 10)
n2 = read(fd, *buffer, 10)
第一次调用read
将文件描述符fd
的10个字节读入buffer
。但是当我再次调用它时,它会读取完全相同的内容,还是会读取 next 10个字节?我真的认为这没有意义,但我认为无法定义所需的起始索引。
答案 0 :(得分:5)
操作系统跟踪文件中的“当前位置”。当您打开文件时,这将是文件的开头。每次调用read
时,都会从当前位置读取一些字节,并提前当前位置。您可以使用lseek
更改当前位置。
请注意,read
也适用于不具有当前位置的内容,例如管道和套接字。由于从那些读取将始终返回您尚未阅读的下一位数据,这使它们与文件的工作方式一致(除了您不能使用lseek
)。
答案 1 :(得分:2)
read(fd, buf, len)
函数将fd
len
引用read
引用的文件描述中存储的偏移量提前。每次调用write
或lseek()
时,操作都会在该偏移量处发生,之后偏移量会增加。您可以使用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()的内容。