• 締切済み

csvデータの添付メール送信について

 xcode6, iOS8, object C の初心者です。
 
iPodtouch の傾斜センサーを使用して、 int angle_ar[] に値を50個ほど
格納したものを、 csvData[ ] にカンマ区切りで入れ(csvデータ),
取得したNSStringをNSdataに次の2行にて変換しました。 (当相談室にて解決済み)
 ファイル保存はせず、データを直接、メール添付にて自分宛に送ろうとしています。 NSString* str = [NSString stringWithCString: csvData encoding:NSUTF8StringEncoding];
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
 ここまでは、デバッガーで内容を確認しました。

 しかし、下記プログラムの
[controller setMessageBody:@"incl_data" isHTML:NO ];
まで行ったところで、(最終行) 
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
 // main.m
 // i_Scol-face_r

 #import <UIKit/UIKit.h>
 #import "AppDelegate.h"
 
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

Thread 1: EXC_BAD_ACCESS (code=1, address=0x3239) と表示され、
}
}
 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

 内容をたどってみると、

libobjc.A.dylib'objc_msgSend:
3行目、
ldrh.w r12, [r9, #0xc] Thread 1: EXC_BAD_ACCESS (code=1, address=0x3539) 

あたりで止まってしまっています。

どなたか、解決策、ご教示頂けましたら、幸いです。

宜しくお願い致します。

 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

- (IBAction)buttn_mail:(id)sender {
 char *value_chr;

 for (int i=0; i <=jcount_m; i++) { 
 sprintf(value_chr, "%d", angle_ar[i]);
    strcat(csvData, value_chr);
strcat(csvData, ",");
 }

 MFMailComposeViewController* controller = [[MFMailComposeViewController alloc] init];

 // 取得したNSStringをNSdataに変換 
// NSData* data = [csvData dataUsingEncoding:NSUTF8StringEncoding]; エラー発生のため、下記に修正

 NSString* str = [NSString stringWithCString: csvData encoding:NSUTF8StringEncoding];
 NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];

 // mimeTypeはtext/csv
 [controller addAttachmentData:data mimeType:@"text/csv" fileName:@"export.csv"];
 [controller setSubject:@"data_ mail" ];
 [controller setToRecipients:[ NSArray arrayWithObject:@"xxx@xxx.ac.jp" ] ];
 [controller setMessageBody:@"incl_data" isHTML:NO ];

 }

みんなの回答

  • heburusu
  • ベストアンサー率85% (140/164)
回答No.3

うーん、現状ではちょっと謎ですね・・・。 お力になれず申し訳ありません。。。 xCodeで開発しているとよく発生するエラーのようですが、 参考URLにデバッグ手順がまとめられているようですので、 ご参考に頂ければと思います。 #既にお試し頂いているかもしれませんが・・・

参考URL:
http://www.zero4racer.com/blog/480
ima_mitsu
質問者

お礼

 コメント、ありがとうございます。抜け出せない迷路に迷い込んだようで、八方ふさがりの感です。 教えて頂いたサイトを参考にし、またファイルとして一時保存したものをメールに添付、というのも試してみたいと思います。  進展ありましたら、ご報告したいと思います。 ありがとうございました。

  • heburusu
  • ベストアンサー率85% (140/164)
回答No.2

早速試してみた頂きありがとうございます。 iOSやxCodeのバージョンによって変更がやや入っているのですね…。 参考URLにpresentViewControllerメソッドが受け取るパラメタが記載されています。 >- (void)presentViewController:(UIViewController *)viewControllerToPresent > animated:(BOOL)flag > completion:(void (^)(void))completion 第一引数にはUIViewController *を受け取るようになっていますので、 以下のようにcontrollerを渡してあげてはどうでしょうか? [self presentViewController:controller animated:YES completion:nil];

参考URL:
http://apple.co/1fjuc5x
ima_mitsu
質問者

お礼

助言、頂き、ありがとうございます。 ご指摘のように [self presentViewController:controller animated:YES completion:nil]; を下記のように入れてみましたが ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー - (IBAction)buttn_mail:(id)sender { // char csvData[200] ="/0"; char *value_chr; for (int i=0; i <=jcount_m; i++) { sprintf(value_chr, "%d", angle_ar[i]); strcat(csvData, value_chr); strcat(csvData, ","); } MFMailComposeViewController* controller = [[MFMailComposeViewController alloc] init]; // 取得したNSStringをNSdataに変換 // NSData* data = [csvData dataUsingEncoding:NSUTF8StringEncoding]; エラー発生のため、下記に修正 NSString* str = [NSString stringWithCString: csvData encoding:NSUTF8StringEncoding]; NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding]; // mimeTypeはtext/csv [controller addAttachmentData:data mimeType:@"text/csv" fileName:@"export.csv"]; [controller setSubject:@"data_ mail" ]; [controller setToRecipients:[ NSArray arrayWithObject:@"xxxx@xxxxx.ac.jp" ] ]; [controller setMessageBody:@"incl_data" isHTML:NO ]; // [self presentModalViewController:controller animated:YES]; xcode6 以降では使えない [self presentViewController:controller animated:YES completion:nil]; } コンパイル時にエラーはでないのですが、実行時にこの行で Thread 1: EXC_BAD_ACCESS (code=1, address=0x03d) というエラーが表示され、そこで、プログラム自体がストップしてしまいます。 不思議です。 どこかで、何かの宣言を忘れてるとか、あるのでしょうか。 宜しくお願い致します。

  • heburusu
  • ベストアンサー率85% (140/164)
回答No.1

こんにちわ。 >[controller setMessageBody:@"incl_data" isHTML:NO ];

 の後に以下行を追加するとどうでしょうか? メール画面が表示されるでしょうか? [self presentModalViewController:controller animated:YES];

参考URL:
http://www.crossbridge.biz/mfmailcomposeviewcontroller-with-image
ima_mitsu
質問者

お礼

ご助言頂き、ありがとうございます。 ただ、[self presentModalViewController:controller animated:YES]; を追加しますと ‘presentModalViewCintroller:amimated’ is deprecated: first deprecated in iOS6.0 と エラー表示されたため、ネットで調べたところ、 iOS 6 以降では [self presentViewController:viewController animated:YES completion:nil];  にするようにとのことでしたので試したところ、今度は Unexpected interface name 'ViewController': expected expression と表示されてしまいます。  xcodeは現在、6.4, iOS:8.4 ですが、バージョンが上がるたびに こういうトラブルが起きてくるのは、ユーザにとっては、とっても つらいところですね。  何か、お気づきの点ありましたら、宜しくお願い致します。

関連するQ&A

  • csvデータのメール添付

    xcode6, iOS8, object C の初心者です。 iPodtouch の傾斜センサーを使用して、 int angle_ar[] に値を50個ほど 格納したものを、csv データにするため、 csvData[ ] にカンマ区切りで 入れています。 ここまでは、デバッガーで確認しました。 しかし、下記プログラムの // 取得したNSStringをNSdataに変換 NSData* data = [csvData dataUsingEncoding:NSUTF8StringEncoding]; の部分で、"bad receiver type" エラーが発生してしまい、”build failed" に なってしまいます。 どなたか、ご教示頂けましたら、幸いです。 宜しくお願い致します。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー - (IBAction)buttn_mail:(id)sender { char csvData[200]; char *value_chr; for (int i=0; i <=jcount_m; i++) { sprintf(value_chr, "%d", angle_ar[i]); strcat(csvData, value_chr); strcat(csvData, ","); } MFMailComposeViewController* controller = [[MFMailComposeViewController alloc] init]; // 取得したNSStringをNSdataに変換 NSData* data = [csvData dataUsingEncoding:NSUTF8StringEncoding]; ここで "bad receiver type" エラーが発生してしまいます // mimeTypeはtext/csv [controller addAttachmentData:data mimeType:@"text/csv" fileName:@"export.csv"]; [ controller setSubject:@"テストメール" ]; [ controller setToRecipients:[ NSArray arrayWithObject:@"xxxx@asahikawa-med.ac.jp" ] ]; [ controller setMessageBody:@"傾斜角data" isHTML:NO ]; }

  • [iPhone]改行をファイル出力する方法

    [iPhone]改行をファイル出力する方法 改行を含む文字列をファイル出力するにはどうするといいのでしょうか。 ファイル出力をNSString→NSData経由で行なっていますが、改行コード(\n)が改行されず、文字として'\n'が出力されてしまいます。 現在のコードは ------------- NSMutableString* mstr = [[NSAutoreleasePool alloc] init]; for (int i=0; i<3; i++) { NSString* str = [NSString stringWithFormat:@"%@,%@\n",@"aaa", @"bbb"]; [mstr appendString:str]; } NSData* out_data = [mstr dataUsingEncoding:NSUTF8StringEncoding]; [out_data writeToFile:@"/user/test.csv" atomically:YES]; [ファイルの内容] aaa,bbb\naaa,bbb\naaa,bbb\n ------------- '\n'を'\r'や'\n\r'にしても、改行されません。 どの様にコーディングするとよいのでしょうか、宜しくお願いします。

  • 【Objective-C】文字列の連結でいい方法ありませんか?

    Objective-Cで文字列、NSStringの連結をするのに、stringByAppendingString:を使って以下のように書きました。 NSString *str1 = @"AAA"; NSString *str2 = [str1 stringByAppendingString: [NSString stringWithCString: "BBB" encoding: NSUTF8StringEncoding]]; しかし、この冗長なコードを何度も書くのは大変です。 そこで、マクロを使って以下のように整理してみました。 #define AS(A,B) [(A) stringByAppendingString:([NSString stringWithCString: B encoding: NSUTF8StringEncoding])] NSString *str2 = AS(str1,"BBB"); 少しはマシになりましたが、できれば+演算子を使って、以下のような、直感的にもわかるコードにしたいです。 NSString *str2 = str1 + "BBB"; NSStringクラスの+プラス演算子を書き換えて、(メソッドオーバーライド) NSString *str2 = str1 + "BBB"; の様ななコードを書く事はObjective-Cで、できるのでしょうか? 以上、ご指導のほど、宜しくお願いいたします。

  • locale::idとid型について

    objective-cでなんでも入れられるid型がありますが、cocos2dの環境下でc++から呼び出したいときにidにあう型がありません。一応std::local::idというのを見つけたのですが void DBClassBridge::updateColumn(string table, string field, locale::id input, string where, string target) { [DBClass_objc updateColumn:[[[NSString alloc] initWithCString:table.c_str() encoding:NSUTF8StringEncoding] autorelease] field:[[[NSString alloc] initWithCString:field.c_str() encoding:NSUTF8StringEncoding] autorelease] input:(id)input //ここでエラー where:[[[NSString alloc] initWithCString:where.c_str() encoding:NSUTF8StringEncoding] autorelease] target:[[[NSString alloc] initWithCString:target.c_str() encoding:NSUTF8StringEncoding] autorelease]]; } 以下のようなエラーが出ます。 Cannot convert 'locale::id' to 'id' without a conversion operator やはりデータ型があっていないっぽいです。 objective-cのid型にはどのデータ型を用いればいいのでしょうか?またはlocal::idからidへとどう変換すればいいのでしょうか? 知っている方、是非お願いします。

  • objective-cとC++の連携

    cocos2dを使ってobjective-cの関数を呼び出したい場合、返り値がstringなどvoidでないときどう記述すればいいのでしょうか? //DBClassBridge.h string DBClassBridge::getStringColumn(string table, string field, string where, id target) { [DBClass_objc getStringColumn:[[[NSString alloc] initWithCString:table.c_str() encoding:NSUTF8StringEncoding] autorelease] field:[[[NSString alloc] initWithCString:field.c_str() encoding:NSUTF8StringEncoding] autorelease] where:[[[NSString alloc] initWithCString:where.c_str() encoding:NSUTF8StringEncoding] autorelease] target:(id)target];   //return ?? } returnのあとに何か入れる感じですかね? わかる人いたら是非お願いします。

  • NSUserDefaultsに構造体を保存する方法

    NSUserDefaultsに構造体を保存する方法をお教えください。 下記のコードで一度実行したあと停止し、行コメントを解除しブロックコメントを有効にして再び実行すると整数のint型は出力できましたが、文字列のchar型は出力できませんでした。文字列をuserDefaultに保存し出力する方法をお教えください。 -(void)viewDidLoad{ typedef struct{ int id; char *names; }member; NSUserDefaults *userdefaults = [NSUserDefaults standardUserDefaults]; // /* //構造体をバイト列としてデータ型に変換してユーザデフォルトに保存する member memberStruct; memberStruct.id = 2; memberStruct.names = "あいうえお"; NSData *data = [NSData dataWithBytes:&memberStruct length:sizeof(member)]; [userdefaults setObject:data forKey:@"strct"]; [userdefaults synchronize]; // */ //取り出し NSData *data2 = [[NSData alloc]init]; data2 = [userdefaults objectForKey:@"strct"]; member memberStruct2; memberStruct2 = *(member *)data2.bytes; int i = memberStruct2.id; char *names2 = memberStruct2.names; NSString *string = [NSString stringWithCString:names2 encoding:NSUTF8StringEncoding]; NSLog(@"i = %i",i); NSLog(@"names2 = %@",string); }

  • CSVファイルの読み込み

    以下のようなCSVファイルを読み込みたいと思っています。 0.575092,0.030525 0.565324,0.018315 0.555556,0.013431 0.553114,0.013431 0.54823,0.015873 0.538462,0.013431 0.531136,0.006105 0.52381,-0.003663 0.516484,-0.010989 0.501832,-0.015873 0.489622,-0.018315 0.477412,-0.020757 0.46276,-0.020757 ・ ・ ・ 50000*2のデータで、以下のようなプログラムを使用しました。 #include <stdio.h> #include <stdlib.h> #include <string.h> /* 確保するデータ保存領域の大きさ(N行×M列) */ #define N 50000 #define M 2 /* データの区切り文字 */ #define SEP_DATA ',' int csv_read(char filename[], double csv[N][M]) { /* ファイルオープン */ FILE *fp; if( (fp = fopen(filename, "r")) == NULL ) { printf(" file open error!!\n"); return -1; } /* 1行毎に読み出し */ char line[256], *ptr; int i, j, k; i=0; while (fgets(line, 256, fp) != NULL) { printf("*%s", line); ptr = line; j=0; do{ /* line[j]から次のタブ文字までを数値に変換 */ csv[i][j] = atof(ptr); /* 次のタブ文字の位置を探す */ ptr = strchr(ptr, SEP_DATA); /* タブ文字の次の文字を示す */ if (ptr!=NULL) { ptr++; } j++; }while(ptr!=NULL && j<M); i++; } /* ファイルクローズ */ fclose(fp); return 0; } int main(int argv, char *argc[]) { char filename[256]; if( argv > 1){ strcpy(filename, argc[1]); } else { printf("Please Input Filename:"); scanf("%s", filename); } /* データ保存用の領域を確保 */ double (*csvdata)[M]; csvdata = (double(*)[M])malloc(sizeof(csvdata) * N); if ( csvdata == NULL ){ return -1; } int i,j; /* 配列の初期化 */ for( i=0; i<N; i++) { for( j=0; j<M; j++) { csvdata[i][j] = 0.0; } } /* CSVデータの読み込み */ if( csv_read(filename, csvdata) < 0 ) { return -1; } /* 配列の出力 */ for( i=0; i<N; i++) { printf("%lf", csvdata[i][0]); for( j=1; j<M; j++) { printf("\t%lf", csvdata[i][j]); } printf("\n"); } free(csvdata); csvdata = NULL; return 0; } しかし、コンパイルは通るのですが実行時にエラーが出てしまいます。 データの大きさに問題があると思うのですが、原因がわかりません。おかしな所のご指摘を頂きたいです。よろしくお願いします。

  • iPhoneアプリ開発 ファイル書き込み

    iPhoneアプリ開発につきまして、質問させて頂きます。 csvファイルへのデータの出力を試みているのですが上手くできません。 プログラムとログ内容を以下に記述しました。 「abc」と予め書いてある「hoge.csv」ファイルに「stringaaaaaaaaaaa」を書き込み保存しておきたいのですが、上手くいきません。 ログ内容を見る限り、「abc」が読み込めているので、パスは合っていると思っています。また、writeToFileをしてから読み込むと「stringaaaaaaaaaaa」が読み込めるため、どこかには書き込めているような気がします。 しかし、毎回同じ処理をしても、最初に読み込まれるのは「abc」です。「hoge.csv」をテキストエディタで読み込んでも表示されるのは「abc」です。 また、iPhoneシミュレーターで実行した結果は以下のログ内容なのですが、iPhone実機で動作させると、writeToFileを行ったあとでも「abc」が出力されます。 何か原因を思い当たる方、教えて頂ければ幸いです。 - (void)viewDidLoad { [super viewDidLoad]; [self setTitle:@"Stress Application"]; printf("viewdidload"); NSString *text = [[NSString alloc] initWithFormat:@"stringaaaaaaaaaaaaaaa"]; NSString *_path = [[NSBundle mainBundle] pathForResource:@"hoge" ofType:@"csv"]; //atomicallyは補助ファイルを使ってファイルの破損を防止するかどうか NSLog(@"%@",[NSString stringWithContentsOfFile:_path encoding:NSUTF8StringEncoding error:nil]); [text writeToFile:_path atomically:YES encoding:NSUTF8StringEncoding error:nil]; NSLog(@"%@",[NSString stringWithContentsOfFile:_path encoding:NSUTF8StringEncoding error:nil]); NSLog(@"%@",text); } <ログ内容> 2012-10-31 12:35:10.187 ThinkGearTouch[17182:1a903] FinishLaunching viewdidload2012-10-31 12:35:10.204 ThinkGearTouch[17182:1a903] abc 2012-10-31 12:35:10.212 ThinkGearTouch[17182:1a903] stringaaaaaaaaaaaaaaa 2012-10-31 12:35:10.212 ThinkGearTouch[17182:1a903] stringaaaaaaaaaaaaaaa

  • 型によらないCSVファイルの読み込みC言語プログラ

    あらかじめ型のわかっているN行*M列のエクセルデータをCSV形式にし、 読み込むプログラムを作成しました。 そのプログラムを下に示します #include <stdio.h> #include <stdlib.h> #include <string.h> /* 確保するデータ保存領域の大きさ(N行×M列) */ #define N 23 #define M 6 /* データの区切り文字 */ #define SEP_DATA ',' int csv_read(char filename[], double csv[N][M]) { /* ファイルオープン */ FILE *fp; if( (fp = fopen(filename, "r")) == NULL ) { printf(" file open error!!\n"); return -1; } /* 1行毎に読み出し */ char line[256], *ptr; int i, j, k; i=0; while (fgets(line, 256, fp) != NULL) { printf("*%s", line); ptr = line; j=0; do{ /* line[j]から次のタブ文字までを数値に変換 */ csv[i][j] = atof(ptr); /* 次のタブ文字の位置を探す */ ptr = strchr(ptr, SEP_DATA); /* タブ文字の次の文字を示す */ if (ptr!=NULL) { ptr++; } j++; }while(ptr!=NULL && j<M); i++; } /* ファイルクローズ */ fclose(fp); return 0; } int main(int argv, char *argc[]) { char filename[256]; if( argv > 1){ strcpy(filename, argc[1]); } else { printf("Please Input Filename:"); scanf("%s", filename); } /* データ保存用の領域を確保 */ double (*csvdata)[M]; csvdata = (double(*)[M])malloc(sizeof(double[M]) * N); //malloc(sizeof(*csvdata) * N); if ( csvdata == NULL ){ return -1; } int i,j; /* 配列の初期化 */ for( i=0; i<N; i++) { for( j=0; j<M; j++) { csvdata[i][j] = 0.0; } } /* CSVデータの読み込み */ if( csv_read(filename, csvdata) < 0 ) { return -1; } /* 配列の出力 */ for( i=0; i<N; i++) { printf("%lf", csvdata[i][0]); for( j=1; j<M; j++) { printf("\t%lf", csvdata[i][j]); } printf("\n"); } free(csvdata); csvdata = NULL; return 0; } これをNとMがどんな値であれ読み込めるようにするにはどうすれいいでしょうか

  • csvファイルの読み込みで失敗します

    以下のようなソースでカンマ区切りのテキストファイルであるcsvファイルの行数、列数、要素数を取得するプログラムを作っているのですが、終わりのメモリ解放であるdelete []strのところでプログラムが落ちてしまいます。範囲外のメモリにアクセスしてしまっているのかと思いますが、ミスを特定できないので、教えてください。 読み込むcsvファイルには以下のような小数の値が入っています。 0.23960810421811729043, 11.753428210139766463, …(省略) , 3.8736893050771881164 int main( int argc, char **argv ) { int csvRowNum, csvColNum, csvElemNum; GetCSVDataNum ( "C:\\Data.csv", csvRowNum, csvColNum, csvElemNum ); return 0; } // csvファイルから行数、列数、要素数を取得する int GetCSVDataNum ( char *csv_name, int &rowNum, int &colNum, int &elemNum ) { FILE *fp; fp = fopen( csv_name, "r" ); if( fp == NULL ){ printf( "ファイルオープンエラー\n" ); exit(1); } // ファイルサイズの取得 int fsize; fseek( fp, 0L, SEEK_END ); fsize = ftell( fp ); // ファイルシーク位置を先頭に戻す fseek( fp, 0L, SEEK_SET ); // ファイルサイズに合わせて文字列領域確保 char *str; str = new char[fsize]; char buf[10000]; // ファイルから1行ずつテキストデータを読み込み、 // 連結してbufに格納する str[0] = '\0'; while ( fgets( buf, sizeof(buf), fp ) != NULL ) { strncat( str, buf, strlen(buf) ); } int countSep = 0; // '(カンマ)の数のカウント int cols = 0; // 各行の列数をカウント int countNL = 0; // 改行の数をカウント // 要素数、行数、列数の取得 for ( int i = 0; i < (int)strlen(str); i++ ) { switch( str[i]){ case ',': countSep++; cols++; break; case '\n': countNL++; cols++; // 各行で列数が異なるときは、最も大きい列数とする colNum = (colNum > cols ) ? colNum: cols; cols = 0; break; default: break; } } rowNum = countNL; elemNum = countSep + countNL; // strの解放で落ちる delete[] str; fclose( fp ); return 0; }