博客
关于我
Objective-C实现读写INI文件(附完整源码)
阅读量:798 次
发布时间:2023-02-22

本文共 4685 字,大约阅读时间需要 15 分钟。

Objective-C 中实现 INI 文件的读写功能

在 Objective-C 中,处理 INI 文件的读写可以通过创建一个简单的类来实现。INI 文件通常包含键值对和节(sections),这些文件采用文本格式存储。以下是一个完整的示例,展示了如何实现读取和写入 INI 文件的功能。

创建 INI 文件处理类

首先,我们创建一个名为 INIFile 的类,继承自 NSObject。这个类将负责解析和存储 INI 文件的内容。具体实现如下:

#import 
@interface INIFile : NSObject
@property (nonatomic, strong) NSMutableDictionary *contents;
@end

实现 INI 文件解析

为了读取 INI 文件,我们需要实现解析方法。以下是解析文件的主要步骤:

  • 初始化一个空的字典来存储 INI 文件的内容
  • 遍历文件的每一行
  • 忽略空行和注释行(通常以 ; 开头)
  • 分隔节和键值对
  • 将键值对添加到字典中
  • 读取 INI 文件的实现代码如下:

    - (void)readFromFile:(NSString *)fileName {
    self.contents = [NSMutableDictionary new];
    NSFileHandle *fileHandle = [NSFileHandle fileHandleWithName:fileName];
    if (!fileHandle) {
    NSLog(@"无法打开 INI 文件:%s", fileName);
    return;
    }
    NSInputStream *inputStream = [fileHandle inputStreamForReading];
    if (!inputStream) {
    NSLog(@"无法获取 INI 文件的输入流");
    return;
    }
    while (!inputStream.atEndOfStream) {
    NSString *line = [inputStream lineOfData];
    if (!line) {
    continue;
    }
    // 忽略注释行
    if ([line rangeOfCharacterFromStart:@";"].location != NSNotFound) {
    continue;
    }
    // 分隔节和键值对
    if ([line rangeOfCharacterFromStart:@"["].location != NSNotFound) {
    // 处理节名称
    } else {
    // 处理键值对
    }
    }
    }

    实现 INI 文件写入

    写入 INI 文件的实现相对简单,主要步骤包括:

  • 初始化写入流
  • 写入每个节和键值对
  • 确保文件正确关闭
  • 写入 INI 文件的实现代码如下:

    - (void)writeToFile:(NSString *)fileName {
    NSFileHandle *fileHandle = [NSFileHandle fileHandleWithName:fileName];
    if (!fileHandle) {
    NSLog(@"无法打开 INI 文件:%s", fileName);
    return;
    }
    NSOutputStream *outputStream = [fileHandle outputStreamToWrite];
    if (!outputStream) {
    NSLog(@"无法获取 INI 文件的输出流");
    return;
    }
    // 写入内容
    [self writeContentsToOutputStream:outputStream];
    // 确保文件被写入
    if (![outputStream synchronizeStreamByCountingBytes]) {
    NSLog(@"未能成功写入 INI 文件");
    }
    [outputStream close];
    }

    完整实现

    为了让您能够直接使用,我们提供一个完整的实现代码:

    #import 
    @interface INIFile : NSObject
    @property (nonatomic, strong) NSMutableDictionary *contents;
    @end
    @implementation INIFile
    - (void)readFromFile:(NSString *)fileName {
    self.contents = [NSMutableDictionary new];
    NSFileHandle *fileHandle = [NSFileHandle fileHandleWithName:fileName];
    if (!fileHandle) {
    NSLog(@"无法打开 INI 文件:%s", fileName);
    return;
    }
    NSInputStream *inputStream = [fileHandle inputStreamForReading];
    if (!inputStream) {
    NSLog(@"无法获取 INI 文件的输入流");
    return;
    }
    while (!inputStream.atEndOfStream) {
    NSString *line = [inputStream lineOfData];
    if (!line) {
    continue;
    }
    // 忽略注释行
    if ([line rangeOfCharacterFromStart:@";"].location != NSNotFound) {
    continue;
    }
    // 分隔节和键值对
    if ([line rangeOfCharacterFromStart:@"["].location != NSNotFound) {
    // 处理节名称
    NSString *sectionName = [line substringFromStart:line.rangeOfCharacterFromStart:@"["].length];
    // 例:[section] -> section
    // 可以进一步处理 sectionName
    } else {
    // 处理键值对
    NSArray *pairs = [line componentsSeparatedByString:]=[line componentsSeparatedByString:@":"];
    if ([pairs count] == 2) {
    NSString *key = [pairs[0] TrimmingCharactersInStrings];
    NSString *value = [pairs[1] TrimmingCharactersInStrings];
    // 添加到 contents 字典中
    [self.contents setValue:value forKey:key];
    }
    }
    }
    }
    - (void)writeToFile:(NSString *)fileName {
    NSFileHandle *fileHandle = [NSFileHandle fileHandleWithName:fileName];
    if (!fileHandle) {
    NSLog(@"无法打开 INI 文件:%s", fileName);
    return;
    }
    NSOutputStream *outputStream = [fileHandle outputStreamToWrite];
    if (!outputStream) {
    NSLog(@"无法获取 INI 文件的输出流");
    return;
    }
    // 写入内容
    [self writeContentsToOutputStream:outputStream];
    // 确保文件被写入
    if (![outputStream synchronizeStreamByCountingBytes]) {
    NSLog(@"未能成功写入 INI 文件");
    }
    [outputStream close];
    }
    - (void)writeContentsToOutputStream:(NSOutputStream *)outputStream {
    [self.contents enumerateKeysAndObjectsUsingBlock:^(NSString *key, id value, BOOL *isStopped) {
    NSString *line = [NSString stringWithFormat:@"%@=%@", key, value];
    [outputStream write:line];
    [outputStream write:@"\n"];
    }];
    // 写入最后一行换行
    [outputStream write:@"\n"];
    }

    使用说明

  • 初始化 INIFile 实例
  • 读取文件或指定文件名
  • 写入文件或指定文件名
  • 通过以上实现,您可以轻松地在 Objective-C 中读取和写入 INI 文件,灵活处理文件内容。

    转载地址:http://zcsfk.baihongyu.com/

    你可能感兴趣的文章