简体   繁体   English

使用 NSInputStream 从文件中读取数字

[英]Read numbers from file using NSInputStream

I am trying to read some input numbers from the file in objective C using NSInputStream.我正在尝试使用 NSInputStream 从目标 C 中的文件中读取一些输入数字。 But unable to do so, I don't want to use readContentsFromFile api, but NSInputStream instead.但无法这样做,我不想使用 readContentsFromFile api,而是使用 NSInputStream。 Please suggest on how to do so.请建议如何这样做。

Important things I am looking at:我正在关注的重要事项:
1. How to read integers from the file. 1. 如何从文件中读取整数。
2. How to convert the data from uint_8 [] to integer. 2.如何将uint_8 []中的数据转换为integer。
3. What size of data should be read at once in NSInputStream? 3. NSInputStream 一次应该读取多大的数据?

Example.txt file: 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
        {
            ....
        }
    }
 }

You should implement NSStreamDelegate methods to read file with NSInputStream .您应该实现NSStreamDelegate方法来使用NSInputStream读取文件。 This is how you should initialise your NSInputStream instance in such case:这就是在这种情况下你应该如何初始化你的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];

Declare the following properties in the class that you use to read file:在用于读取文件的 class 中声明以下属性:

@interface MyClassToReadFile: NSObject<NSStreamDelegate>

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

@end

This is how you can implement stream:handleEvent: :这是实现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;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM