• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: writing huge C-array to a file
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: writing huge C-array to a file


  • Subject: Re: writing huge C-array to a file
  • From: Bill Bumgarner <email@hidden>
  • Date: Fri, 21 Jul 2006 09:01:20 -0700

On Jul 21, 2006, at 8:04 AM, PGM wrote:
In my app, I have a document containing a potentially huge two- dimensional C-array filled with doubles that I need to write to a file (with a user-specified number of decimals). My original plan was to use NSDocument's "dataRepresentationOfType" and fill an NSMutableString with the text and use that. However, this takes forever because the NSMutableString has to allocate additional memory again and again ("initWithCapacity" did not help much).

What I did then is to use "writeToFile:ofType:" and then use plain C to write the data to a file:

    	FILE *writing;
     double **matrix = [myData distanceMatrix];
     const char *out_name;
     out_name = [fileName cString];
     writing = fopen(out_name, "w");
	fprintf(writing, everything); //looping over the matrix

This works, but I am afraid that it will break when the fileName contains non-ASCII characters. Is there another fast way to write a large C-array to a file that does work with non-ASCII filenames?

(Others have pointed out not to use cString, etc..)

You are writing binary data to a file. It isn't a string and, thus, NSMutableString is completely inappropriate for the task at hand.

You can use NSFileHandle:
+ (id)fileHandleForWritingAtPath:(NSString *)path

http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ Classes/NSFileHandle_Class/Reference/Reference.html#//apple_ref/occ/ clm/NSFileHandle/fileHandleForWritingAtPath:

Followed by a series of calls to writeData:

- (void)writeData:(NSData *)data

http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ Classes/NSFileHandle_Class/Reference/Reference.html#//apple_ref/occ/ instm/NSFileHandle/writeData:

Of course, you will need to get your double* arrays into an instance of NSData for writing. You will want to avoid copying the data in doing so:

+ (id)dataWithBytesNoCopy:(void *)bytes length:(unsigned)length

http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ Classes/NSData_Class/Reference/Reference.html#//apple_ref/occ/clm/ NSData/dataWithBytesNoCopy:length:

_______________________________________________
Do not post admin requests to the list. They will be ignored.
Cocoa-dev mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden


  • Follow-Ups:
    • Re: writing huge C-array to a file
      • From: Steve Bird <email@hidden>
References: 
 >writing huge C-array to a file (From: PGM <email@hidden>)

  • Prev by Date: Removable vs Local Volumes
  • Next by Date: Re: NSSearchField: sendsSearchStringImmediately is not PPC & i386 compatible?
  • Previous by thread: Re: writing huge C-array to a file
  • Next by thread: Re: writing huge C-array to a file
  • Index(es):
    • Date
    • Thread