• 締切済み

教えてください。(改行について)

データ 0.29498E-07 0.20257E-07 0.66597E-08 0.63194E-09-0.64569E-07-0.15007E-06改行 -0.27140E-06-0.32665E-07 0.76314E-07 0.11055E-06 0.13775E-06 0.16317E-06 上記のデータが入ったファイルをfoprnでテキストデータとして読み,C[l]という配列に格納したいと考えています。 そこで下記のプログラムを書きました。 FILE *fp; long l; char data[12]; long number; for(l=0;l< number;l++){ fread(data,12,1,fp); c[l]=atof(data); } しかし、改行の部分を正しく読めていません。どこを訂正すれば良いかわかりません。 可能であれば教えていただけないでしょうか? よろしくお願いいたします。

みんなの回答

noname#208507
noname#208507
回答No.5

想像ですが、1つの数値文字列が12バイト固定長のデータを読みたいということで合っているでしょうか? なら、いつも12文字ずつ読み込んでいる点が間違っているのです。6番目のデータ(つまり行末)は改行を含めて13文字以上読み込まないと、次のデータを読み込むとき1文字ずれてしまいます。 例えばこう。 FILE *fp; long k,l; char data[12+1]; int loop = 1; l = 0; while (loop) { cancel: for (k = 0; k < 12; k++) { if (fread(&data[k], 1, 1, fp) == 1) { if (data[k] == '\r' || data[k] == '\n') goto cancel; /* 改行なら読み捨て */ } else { loop = 0; } } data[k] = '\0'; c[l] = atof(data); l++; }

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

改行に何の意味があるんだろう.

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

fread()よりも、1行まるごとfgets()して、sscanf()あたりで取り出すのが 無難な気がします。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

freadで12文字いっきに読むのではなく、「1文字ずつ読む。改行だったら無視する。12文字になるまで繰り返す」ようにしたらどうでしょう? あと char data[12]; に12文字入れたら\0が入らないので、atofが変な結果を返すことが考えられます。 ところで、longなのはなにか意図があるのでしょうか?

  • f272
  • ベストアンサー率46% (8013/17127)
回答No.1

改行が2バイトだったというおち?

関連するQ&A

  • 2次元配列への格納方法について

    こんにちは。 FILE *fp; SIZE 1024; int n; char Buf[1025]; while((n = fread(Buf,1,SIZE,fp)) != 0){ } というように、fread関数を用いて1024バイトずつ配列Bufへ格納しています。 以下に示すようなことを行う場合、どのように記述すればよいのでしょうか? B:バイナリデータ T:数値 TBBBBBBBBB・・・・・・B←1024バイト目 TBBBBBBBBB・・・・・・B ・ ・ ・ ・ TBBBBBBBBB・・・・・・B というように、配列内に格納したいと思っています。 Tは、テキストデータで1,2,3・・・・100という整数型を格納。Bは、バイナリデータでfread関数から取得したバイナリデータを格納します。 なぜ、Tを格納したいかといいますと、どのバイナリデータを指しているか?を判別するためです。 上記のようなことを行うためには、2次元配列を使用すればよいのでしょうか? 例:char Buffer[100][1025]

  • 改行されたtxtファイルの読み込み(C++)

    3374356,4785323,7043817,5111179,8267572, 6486903,3258714,6344689,8620512,7434933, 8088837,8231528,6524254,5928445,7101798, 5338215,5233711,4753647,5930266,7512232, 5343749,5813061,6439450,6257874,5724787, 5864114,9006652,4871427,6158077,7343041, 7615426,7168142,5866379,8154664,7342803, という形式のデータ数1000のtxtファイルがあります。 解析に使用したいのでCに読み込みたいのですが、方法が調べても分からず困っています。とりあえず以下が、データが一行の際に使用しているソースコードです。 FILE *fp; char linebuf[4096]; char *p; int array[1024]; int data=0; fp=fopen("randombetarev.txt","r"); if(!fp) return 1; fgets(linebuf,4096,fp); fclose(fp); p=strtok(linebuf,","); do{ array[data]=atoi(p); data++; }while(p=strtok(NULL,","));//ここまででデータを配列に格納 これでは改行の判別ができないので初めの一行目のデータしか読み込めません。どなたかご教授ください。

  • fread関数および動的なメモリ確保について

    こんにちは。 ファイルオープンし、fread関数にて1バイトずつ1024個をPktBuf配列へ格納し、sendto(winsock関数でUDPソケットの関数です)で1024Byteずつ送信しています。 #define DATA 1024 FILE *fp; char PktBuf[1024] fp = fopen(SEND_FILE_NAME,"rb+"); while((n = fread(PktBuf,1,DATA,fp)) != 0) {   sendto } fread(PktBuf,1,DATA,fp)の第2引数で、1と指定しているのですが・・・HPを参考にしているとsizeof(int)やsizeof(char)などが明記されている場合があるのですが、これは移植性を気にする場合に必要なことなのでしょうか? もし、第2引数のところを1から2へ変更した場合、2Byte×1024個=2048Byteとなり、配列[1024]に格納できないことを意味するのでしょうか? 最後に、fread関数およびmallocまたはcalloc関数を用いた、動的なメモリ確保について勉強しているのですが、記述方法がわからない状態です・・・現在の記述方法で問題はないのですが、動的なメモリ確保をすることが定説?と書かれていましたので、そちらも知りたいと思っています。 よろしくお願いします。

  • ファイル出力で改行を入れたい!

    data.txtにファイル出力を行うのですが、gets(c)で入力した一語一語に改行を入れてdata.txtに出力したいのですがどうすればよいでしょうか。 返答のほどよろしくお願いいたします。 include<stdio.h> #define SIZE 20 void main(void) { char c[SIZE], *p; FILE *fp; fp = fopen("data.txt","w+"); p = c; while(gets(c) != NULL){ fputs(p,fp); } fclose(fp); printf("data.txtへ出力しました\n"); }

  • fread()エラー

    お世話になります。 今、バイナリファイルを操作しているのですが、 fread()でエラーになってしまいます。 char buf1[256]; FILE *fp; vector<string> f1; int num; fp = fopen("hoge.txt","r"); while( fgets( buf1, sizeof(buf1),fp ){ f1.push_back( buf1 ); num ++; } fclose(fp); FILE *cfp; unsigned char data[1024]; for(int i=0; i<num; i++ ){ cfp = fopen(f1[i].c_str(), "rb"); fread( data, sizeof(char), 1024, cfp ); } hoge.txtには、コンテンツ場所(パス)が複数記載されており、 その1つずつをfread()で読み込み解析したいのですが、 fread()でセグメンテーション違反になります。 f1の中味をprintf("%s",f1[0].c_str()); で見てみると正常にコンテンツの場所が格納されています。 また、 string pp = "/home/hoge/hoge.txt"; cfp = fopen(pp.c_str(), "rb"); fread(bb,sizeof(char),1024,cfp); とすると正常に動作します。 どうぞよろしくお願い致します。

  • Stirlingについて

    バイナリファイルに16ビットで表現された正数が順番に格納されています. もし(10進数で)1,10,15の値がこの順番で格納されていたら, Stirlingではどのように表示されるのでしょうか? ファイルからこのデータx個を配列dataに読み込むために unsigned short data[x]; fseek(fp, 0L, SEEK_SET); /* ファイルポインタを先頭へ */ fread(data, 2, x, fp); /* 2バイトずつx個読み込む */ としたのですが, このdata[i]に正しく格納されているか確認したいためです. Stirlingで「00 01 00 0A 00 0F」となっていれば,   data[0]:1,data[1]:10,data[2]:15 になると思ったのですが,   data[0]:256,data[1]:2560,data[2]:3840 になりました. ちなみに,256,2560,3840は16進では100,A00,F00です. どこか間違っているのでしょうか? 長くなりましたが,どなたかご教授ください.

  • CSVファイル読込みのエラーに関して??

    下にプログラムの一部を書いてます。 このプログラムでは、b[g]にあたるCSVファイルを読み、 csv_value[j4][i4]に格納しようとしています。 しかし、すべての列で1列目の値が配列に格納されてしまいました。 間違いがわからずに困っています。 もし詳しい方がいましたら教えていただけないでしょうか? どうかよろしくお願いいたします。 char b[1000][50]; long g; long i4; long j4; char str0[500000]; long line_number; g=0; fp = fopen(b[g],"r"); for(i4=0;i4<line_number;i4++){ fgets(str0,500000,fp); for (j4=0;j4<32;j4++){ csv_value[j4][i4]=atoi(strtok(str0,",")); } }

  • 配列のサイズ変更

    FILE *fp; char *fname = "test.txt"; unsigned char init[300]; int i = 0; int c; fp = fopen( fname, "r" ); if( fp == NULL ){ printf( "%sファイルが開けません\n", fname ); return -1; } while( (c = fgetc( fp )) != EOF ){ init[i] = c; i = i+1; } fclose( fp ); 自分のプログラムの中のこのようなテキストから文字を読んで配列に格納するような動作の中で、initを大きめにとっておいて配列に格納し終わったら余った空の配列を削除する、という機能を拡張したいのですがどのようにすればいいかわかりません。 どなたか教えていただけないでしょうか?

  • プログラム BCB

    for (int I = 1; I <=20 ; I++){   pass = ID +"0"+IntToStr(I); fp = fopen(pass.c_str(), "rb" ); fread(data,2,10,fp); } と途中まで作ったのですが、この20個の読み込んだ配列データを20個別々にA1~A20(AnsiString)みたいな感じで格納したいのですがやりかたがわからないのでアドバイスください。

  • とあるプログラムを教えてほしいのですが

    はじめましてこんばんは hommado と申します。 じつは先週の授業でこんな問題を出されたんですがもしできたらとあるプログラムを教えてほしいのです。 問題は 「キーボードから何階調にするのかを読み込むことで、入力画像LAX.bmpを任意の階調数に変換する」という プログラムです。 一応下に素体のプログラムをおいたんで、其のプログラムに何か付け足す感じでお願いします。「/*******↓基本的には、この範囲に画像処理プログラムを書く****/」から 「 /********↑**************************************************/」の中にプログラムを書くかんじなのでもし分かったら教えてください。お願いします。 あと何か他の所に付け足すようなところがあったら教えてください ここから元のプログラム // Bitmapファイルを読み込んで, // 別のファイルに出力するだけのプログラムです #include<stdio.h> #define XSIZE 256 /* 画像の横サイズ*/ #define YSIZE 256 /* 画像の縦サイズ*/ void main(void) { int x,y; char fni[40],fno[40]; /* 入力ファイルと出力ファイルの名前を格納するための配列*/ unsigned char head[1078],buf[YSIZE][XSIZE]; /* 入力ファイル(ビットマップファイル)のヘッダ情報と輝度値情報を格納するための配列*/ unsigned char in_image[YSIZE][XSIZE]; /* 入力画像の画素の輝度値を格納するための配列*/ unsigned char out_image[YSIZE][XSIZE]; /* 出力画像の画素の輝度値を格納するための配列*/ FILE *fp,*fp2; /* ファイルポインタ*/ printf("ファイル名を入れてください:"); scanf("%s",fni); fp=fopen(fni,"rb"); /* 読み込み& バイナリモードでオープンする*/ /* 配列head にビットマップファイルのヘッダ情報が格納されます*/ fread(head,sizeof(unsigned char),1078,fp); /* unsigned char 型のデータ×個を配列head に読み込む*/ /* 配列buf にビットマップファイルの輝度値情報が格納されます*/ fread(buf,sizeof(unsigned char),XSIZE*YSIZE,fp); for(y=0;y<YSIZE;y++){ for(x=0;x<XSIZE;x++){ in_image[y][x]=buf[y][x]; /* 画像の左下の画素が座標buf[0][0] です*/ } } printf("読み込み終了しました!\n"); printf("出力ファイル名を入れてください:"); scanf("%s",fno); /*******↓基本的には、この範囲に画像処理プログラムを書く****/       ここにプログラムを書いてください!      (もしここ以外で、他の所で付け足すプログラムがあったら何行目に       何を書くのかも教えてください) /********↑**************************************************/ fp2=fopen(fno,"wb"); /* 書き込み& バイナリモードでオープンする*/ /* 配列head の内容を出力ファイルに書き込む*/ fwrite(head,sizeof(unsigned char),1078,fp2); /* 配列out_image の内容を出力ファイルに書き込む*/ fwrite(out_image,sizeof(unsigned char),XSIZE*YSIZE,fp2); fclose(fp); /* ファイルをクローズする*/ fclose(fp2); /* ファイルをクローズする*/ printf("作業完了!\n"); }

専門家に質問してみよう