首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NSInputStream从文件中读取数字

使用NSInputStream从文件中读取数字
EN

Stack Overflow用户
提问于 2019-10-12 17:19:19
回答 1查看 298关注 0票数 0

我正在尝试使用NSInputStream从目标C中的文件中读取一些输入数字。但无法做到这一点,我不想使用readContentsFromFile api,而是使用NSInputStream。请建议如何这样做。

我所看到的重要事情:

如何从文件中读取整数。NSInputStream?

  • 如何将数据从uint_8 []转换为整数。

  • 在uint_8中应该同时读取数据的大小

Example.txt文件:

代码语言:javascript
复制
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
代码语言:javascript
复制
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
        {
            ....
        }
    }
 }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-13 17:13:19

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

代码语言:javascript
复制
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];

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

代码语言:javascript
复制
@interface MyClassToReadFile: NSObject<NSStreamDelegate>

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

@end

这就是实现stream:handleEvent:的方法

代码语言:javascript
复制
- (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;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58356618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档