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

时间:2014-06-24 12:38:45

标签: ios nsdata fseek nsfilehandle nsoutputstream

我是ios的新手 我有10个1024字节的块。这个块不合适。 如果我知道块的数量我怎么能将数据插入大小为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];
    }

但是如果块的顺序不正确,则结果文件不完全正确。如果块的顺序正确,则表明结果文件正确显示。

2 个答案:

答案 0 :(得分:2)

示例:

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];

答案 1 :(得分:0)

关于问题的第一部分(我如何到达这里),如果您只想要一个特定大小的空文件...

import pandas as pd
df = pd.DataFrame({"A":[1, 2, 3, 4], 
                   "B":[0, 1, 0, 1], 
                   "C":[3, 5, 8, 9], 
                   "D":[1, 2, 2, 1]})

df.apply(lambda x:x.is_monotonic)

A     True
B    False
C     True
D    False
dtype: bool