Search code examples
objective-cfloating-pointnsfilehandle

Reading float from a custom file


I want to read some float value one by one from a custom file I defined "player.geo".

player.geo is a file I created using Xcode 4 ("Empty File" from the File > New menu)

I'm currently trying to do it like this:

- (id) initWithGeometryFile:(NSString *) nameOfFile
{
    NSFileHandle *geoFile = NULL;

    NSString *geoFilePath = [[NSBundle mainBundle] pathForResource:@"player" ofType:@"geo"];

    geoFile = [NSFileHandle fileHandleForReadingAtPath:geoFilePath];

    if(geoFile == NULL)
    {
        NSLog(@"Failed to open file.");
    }
    else
    {
        NSLog(@"Opening %@ successful", nameOfFile);

        NSMutableData *fileData = [[NSMutableData alloc] initWithData:[geoFile readDataOfLength:4]];

        float firstValue;
        [fileData getBytes:&firstValue length:sizeof(float)];

        NSLog(@"First value in file %@ is %f", nameOfFile, firstValue);
    }

    return self;
}

I'm not getting the expected value of -64.0, rather I'm getting 0.0.

Is this the right way to go about it?

Do I really have to read the file as a string and then parse float the string contents to get the float value?


Solution

  • NSData objects deal with raw bytes, not strings. If you are typing in a string into a txt file, this will not work. If you are using NSData objects, then you will need to first write the data using the data object methods such as writeToFile:atomically:.

    Alternately, you can use the NSString functions stringWithContentsOfFile and componentsSeperatedByString to generate an NSArray containing each string on it's own line, like so:

    NSString *tmp;
    NSArray *lines;
    lines = [[NSString stringWithContentsOfFile:@"testFileReadLines.txt"] 
                       componentsSeparatedByString:@"\n"];
    
    NSEnumerator *nse = [lines objectEnumerator];
    while(tmp = [nse nextObject]) {
        NSLog(@"%@", tmp);
    }