使用NSInputStream从文件中读取数字

时间:2019-10-12 17:19:19

标签: objective-c objective-c++ nsinputstream

我正在尝试使用NSInputStream从目标C中的文件中读取一些输入数字。但无法执行此操作,我不想使用readContentsFromFile api,而是使用NSInputStream。请提出建议。

我正在查看的重要内容:
1.如何从文件中读取整数。
2.如何将数据从uint_8 []转换为整数。
3.应该在NSInputStream中一次读取什么大小的数据?

Example.txt文件:

20 30 40 50 60 70 80 90 100 120 140 160 180 190 20 30 40 50 60 70 80 90 100 120 140 160 180 190 20 30 40 50 60 70 80 90 100 120 140 160 180 190 20 30 40 50 60 70 80 90 100 120 140 160 180 190 20 30 40 50 60 70 80 90 100 120 140 160 180 190


NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Example" ofType:@"txt"];
NSInputStream *stream = [NSInputStream inputStreamWithFileAtPath:filePath];
 [stream open];
 for(int i = 0; i < 20; i ++)
 {
    if(stream && [stream hasBytesAvailable])
    {
        uint8_t buffer[1024];
        NSUInteger len = [stream read:buffer maxLength:32];
        if(len>0)
        {
            NSLog(@"%ld",buffer[0]);
        }
        else
        {
            ....
        }
    }
 }

1 个答案:

答案 0 :(得分:1)

您应该实现NSStreamDelegate方法来使用NSInputStream读取文件。在这种情况下,应该这样初始化NSInputStream实例:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Example" ofType:@"txt"];
NSInputStream *stream = [NSInputStream inputStreamWithFileAtPath:filePath];
[stream setDelegate:self]; // or any other object conforming to NSStreamDelegate
[stream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[stream open];

在用于读取文件的类中声明以下属性:

@interface MyClassToReadFile: NSObject<NSStreamDelegate>

@property (strong, nonatomic) NSMutableData* data;
@property (nonatomic) NSInteger bytesRead;

@end

这是实现stream:handleEvent:的方式:

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
    switch (eventCode) {
    case NSStreamEventHasBytesAvailable: {
        if(!_data) {
            _data = [NSMutableData data];
        }
        uint8_t buf[1024]; // or any other size
        NSInteger len = [(NSInputStream *)stream read:buf maxLength:sizeof(buf)/sizeof(buf[0])];
        if(len) {
            [_data appendBytes:(const void *)buf length:len];
            _bytesRead += len;
        }
        break;
    }
    case NSStreamEventEndEncountered: {
        [stream close];
        [stream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        NSString* fileData = [[NSString alloc] initWithData:_data encoding:NSASCIIStringEncoding];
        NSArray<NSString*>* numbersAsStrings = [fileData componentsSeparatedByCharactersInSet:NSCharacterSet.whitespaceCharacterSet];
        NSMutableArray<NSNumber*>* numbers = [NSMutableArray array];
        for (NSString* numberAsString in numbersAsStrings) {
            [numbers addObject:[NSNumber numberWithLongLong:numberAsString.longLongValue]];
        }
        for (NSString* numberAsString in numbersAsStrings) {
            NSLog(@"%lld", numberAsString.longLongValue);
        }
        break;
    }
    default:
        break;
    }
}