gpt4 book ai didi

ios - 创建一个特定大小的空文件并使用 fseek 将新数据写入特定位置

转载 作者:行者123 更新时间:2023-11-29 10:41:23 25 4
gpt4 key购买 nike

我是 ios 新手我有 10 个 1024 字节的 block 。这些 block 没有顺序。如果我知道 block 的数量,如何将数据插入大小为 10*1024 的文件中?到目前为止,我有以下代码:

//method called when new chunk arrvies


NSArray *paths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

//create a file name to write the data to using the documents directory:
filePath = [NSString stringWithFormat:@"%@/example.txt",
documentsDirectory];

NSFileHandle *writeFile = [NSFileHandle fileHandleForWritingToURL:filePath error:nil];
[writeFile truncateFileAtOffset:10240*sizeof(Byte)];

如何使用 fseek 添加新数据?

我确实尝试使用以下代码:

if ((chunkNo == 0 )||(chunkNo == 10))
{
NSOutputStream *stream = [[NSOutputStream alloc] initToFileAtPath:filePath append:YES];
[stream open];
NSData *chunk = chunkContainer; // some data
[stream write:(uint8_t *)[chunk bytes] maxLength:[chunk length]];
[stream close];

}
else{
NSData *chunk = chunkContainer; // some data
NSUInteger insertPoint = chunkNo*1024; // get the insertion point //
// make sure the file exists, if it does, do the following //
NSData *oldData = [NSData dataWithContentsOfFile:filePath];

NSOutputStream *stream = [[NSOutputStream alloc] initToFileAtPath:filePath append:NO];
[stream open];
[stream write:(uint8_t *)[oldData bytes] maxLength:insertPoint]; // write the old data up to the insertion point //
[stream write:(uint8_t *)[chunk bytes] maxLength:[chunk length]]; // write the new data //
[stream write:(uint8_t *)([oldData bytes]+insertPoint) maxLength:([oldData length]-insertPoint)]; // write the rest of old data at the end of the file //

[stream close];
}

但是如果 block 的顺序不正确,结果文件并不完全正确。如果 block 的顺序正确,则结果文件会正确显示。

最佳答案

例子:

NSString *filePath = [@"~/Desktop/FHTest.txt" stringByExpandingTildeInPath];

[[NSFileManager defaultManager] createFileAtPath:filePath contents:[NSData new] attributes:nil];
NSFileHandle *fh;

NSData *data1 = [@"test Data" dataUsingEncoding:NSUTF8StringEncoding];
fh = [NSFileHandle fileHandleForUpdatingAtPath:filePath];
[fh writeData:data1];
[fh closeFile];

NSData *data2 = [@"more Data" dataUsingEncoding:NSUTF8StringEncoding];
fh = [NSFileHandle fileHandleForUpdatingAtPath:filePath];
[fh seekToFileOffset:100];
[fh writeData:data2];
[fh closeFile];

请注意,seekToFileOffset:100 将根据需要用 0x00 字节填充扩展文件。

要创建特定大小的文件,在本例中为 100 字节:

unsigned long long size = 100;
[[NSFileManager defaultManager] createFileAtPath:filePath contents:[NSData new] attributes:nil];
NSFileHandle *fh = [NSFileHandle fileHandleForUpdatingAtPath:filePath];
[fh seekToFileOffset:size-1];
[fh writeData:[@"\x00" dataUsingEncoding:NSUTF8StringEncoding]];
[fh closeFile];

关于ios - 创建一个特定大小的空文件并使用 fseek 将新数据写入特定位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24386858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com