• 締切済み

FILE構造体のファイルポインタについて質問です。

peanus15の回答

  • peanus15
  • ベストアンサー率36% (7/19)
回答No.4

同じC関数でもコンパイラーによってでも違うらしいのでC関数は扱い辛いです また、マルチタスク環境下ではシステム関数を推奨されていますので fopen は使いません。 (2)について その事象 '0xcdcdcdcd' は検索すれば見つかりますが、検索されたのでしょうか? OS提供のシステム関数(API)を使えば読込んだバイト数が戻ります 基よりファイルサイズを事前に取得して認識の上アクセスすれば良いことです http://homepage3.nifty.com/mmgames/c_guide/q_filesize.html

関連するQ&A

  • ファイルから読み込んだデータを構造体に格納できますか?

    1レコード19バイトのファイルを 読み込む処理を行っています。 地区名10バイト 県名8バイト 改行1バイト このデータをdouken(構造体)に格納したいのですが >while (fgets(dou,19,fp) != NULL){ で、エラーになってしまいます。 どのようにしたら ファイルから読み込んだデータを 構造体に格納できますか? #include<stdio.h> #include <stdlib.h> struct douken { char tiku[10]; char ken[8]; } main(void){ FILE *fp; struct douken dou[100]; int i; fp = fopen("ex3.fil","rb"); if ( fp == 0 ){ printf("can't open\n"); exit(1); } while (fgets(dou,19,fp) != NULL){ ・ ・ ・

  • ポインタと配列

    次のソースで、結果表示でポインタを使いたいのですが、うまくいきません。1件しか表示されないのです。 ポインタの扱いがおかしいのだと思いますが、どうしたらよいでしょうか? #include <stdio.h> #include <string.h> int search(char key[256],FILE *fp,char *result[256][256]); main(void) { FILE *fp; int rep,n,i; char x[256],key[256],*result[256][256]; printf("検索キーワードを入力してください。\n" "キーワード>"); gets(key); if((fp=fopen("personal.txt","r"))==NULL) { printf("ファイルをオープンできません\n"); exit(1); } printf("=====検索結果=====\n"); n=search(key,fp,result); for(i=0;i<n;i++) { printf("%s\n",result[i]); } printf("検索結果:%d件です。\n",n); fclose(fp); } int search(char key[256],FILE *fp,char *result[256][256]) { int n=0; char *p,word[256],*name; while((p=fgets(word,256,fp))!=NULL) { if(strstr(word,key)!=NULL) { name=strtok(p," "); strcpy(result[n],name); n++; } } return n; } 実行すると、下の警告がでます。 illegal pointer combination(param)

  • csvファイルのデータを構造体に

    csvファイルのカンマを数えて任意の文字列を抜き出すまでは出来たのですがそこから構造体に格納するまでがこちらのサイトでも検索しましたがよくわかりません。 ご指摘のほどよろしくお願いします。 csvデータ 番号,名前,住所,電話,年齢,性別 1,佐藤,東京,1234,33,A 2,田中,,5678,22, 3,坂井,名古屋,,,B ・ ・ 番号,住所,電話,年齢を格納する場合 struct k_data { char no[4];/* 出来れば番号を右詰めにしたい */ char add[20]; int tel; int age; } kaiin[256]; /* 文字列を抜き出す↓ */ int main(void) { FILE *fp1,*fp2; char dat[256]; char *ch; int cnt; /* fp1 ファイルオープン */ /* fp2 ファイルクローズ */ while (fgets(dat, 256, fp1) != NULL) { cnt = 0; for (ch = dat; *ch != '\0'; ch++) { if (*ch ==',') { if (cnt == 0) { putc(*ch, fp2); } if (cnt == 2) { putc(*ch, fp2); } if (cnt == 3) { putc(*ch, fp2); } if (cnt == 4) { putc('\n', fp2); } cnt++; } else { if (cnt == 0) { putc(*ch, fp2); } if (cnt == 2) { putc(*ch, fp2); } if (cnt == 3) { putc(*ch, fp2); } if (cnt == 4) { putc(*ch, fp2); } } } putc('\0', fp2); } fclose(fp2); fclose(fp1); }

  • ファイル関数について

    こんばんはです。 次のソースは、構造体の中にファイルから読み込んだDATAを格納する部分です。 ファイルに書き込む際に for(i = 0;i<AllMen;i++){  fputs((person + i)->name,fp);  fputs("\n",fp);//(1)  fputs((person + i)->mail,fp);  fputs("\n",fp);//(1) } fclose(fp); と、上記の様に、(1)のところで無理やり改行をいれて、ファイルに書き込んでます。 fgetsで一行分読み込むとき、nameとmailを分けて取りたいからです。 javaでは、newLineと言うものがあり、\nをしなくてもファイルには 次の行に移動する手段がありますが、Cには無いのでしょうか? fgetsする際に\nがどうしても不都合なのです。 過去に同じ経験のある方、高スキルの方のご回答いただければ嬉しいです。 よろしくお願いいたします。

  • charのポインタについて

    同じような質問ばっかりたて続けにしてしまってすみません・・ あの,以下のような例の時↓ ------ { char array[7]; char *ptr; strcpy(array, "abcdef"); ptr = &(array[0]); printf(" array = %s\n ptr = %s\n", array, ptr); } ------ これを実行したら、 array = abcdef ptr = abcdef となりますが、ポインタとして宣言してるptrから文字列を得たい時は *ptr と書くんではないのでしょうか? %s のように出力形式のところを指定をするだけで 文字列で表示してくれるのはなぜですか? 上の例のように書くのが正しいのでしょうか

  • fgetsとsscanfの使い方

    初歩的な質問で申し訳ないのですが、fgetsとsscanfの使い方が合っているか確認願います fgets(char *s , int n ,FILE *fp); -> fpから1行(nで指定した文字数)読み込み、sに格納する sscanf(char buf, "%s", char string); -> bufから%sを読み込み、stringに格納する まだ使い慣れていないのでどっちから読み込むのかこんがらがってます 上記の解釈でよろしいのでしょうか?

  • ポインタ配列の動的確保

    ポインタの配列の動的確保について教えてください。 入力した数値をポインタ配列に入れるプログラムです。 下記のように書いてみました。(見づらくてごめんなさい) #include<stdio.h> #include<stdlib.h> #define kensu 3 main() { char abc[kensu+1]={'A','B','C','\0'}; char *ptr[kensu]; int i; printf("3つの整数を入力して下さい。\n"); for(i=0;i<kensu;i++){ ptr[i]=(char*)malloc(sizeof(char)*10); if(ptr[i]==NULL){ printf("メモリの取得に失敗しました"); exit(1); } printf("整数%c:",abc[i]); fgets(ptr[i],10,stdin); if(ptr[i][strlen(ptr[i])-1]=='\n') ptr[i][strlen(ptr[i])-1]='\0'; } for(i=0;i<kensu;i++) free(ptr[i]); } ちゃんと動いているようです。 しかし、ポインタ配列の動的確保をネットで調べてみると、ポインタのポインタ(?)を使って、下記のように2度mallocしています。 #include <stdio.h> #include <stdlib.h> #define N 3 int main(void) { char** arr; int i,j; arr = (char**)malloc(N * sizeof(char*)); /* ポインタ配列を確保 */ /* 配列の要素それぞれにつき、メモリ領域を確保 */ for(i=0;i<N;i++) arr[i] = (char*)malloc(N * sizeof(char));   ・・・ ポインタの配列を宣言して、配列の各要素に動的確保するのと ポインタのポインタを宣言し、ポインタ配列を動的確保して、再度配列の要素に動的確保するのとでは、何か違いがあるのでしょうか? ポインタのポインタを宣言し、ポインタ配列を確保する必要性が良く分かっていないのです。 ネット等で調べて見たのですが、理解力がないのかよく分かりませんでした。 どうか教えてください。

  • ポインタと構造体の利用について

    samplefile.txtの中身 c03888 工大八郎 90 a03111 工大一郎 100 a03222 工大二郎 30 b03666 工大六郎 70 b03555 工大五郎 60 a03333 工大三郎 80 c03777 工大七郎 40 c03999 工大九郎 20 b03444 工大四郎 50 このデータをfscanfで取り込んで構造体に代入 typedef struct { char code[7]; char name[21]; int score; }REC; そしてこのデータを昇順にソートして結果を出力したいのですが 問題はここから work52.cというファイルとbubble.cというファイルとmy_sort.hというファイルがあり、work52.cからmy_sortという関数(バブルソート)を使いたい。 work52.cの中身 #include <stdio.h> #include "my_sort.h" #define MAX_NUM 500 int main(int argc, char *argv[]){ FILE *fp; REC rec[MAX_NUM]; int i, sum , min, max , n; if (argc != 2) { printf("ファイル名を指定してください\n"); return(-1); } if ((fp = fopen(argv[1], "r")) == NULL) { printf("ファイルを開けませんでした\n"); return(-1); } i = 0; while (fscanf(fp, "%s %s %d", rec[i].code, rec[i].name, &rec[i].score) != EOF){ i++; } fclose(fp); n = i; /* 初期値の設定 */ min = rec[0].score; max = rec[0].score; sum = rec[0].score; for (i = 1; i < n; i++){ sum += rec[i].score; if (rec[i].score < min) { min = rec[i].score; } if (rec[i].score > max) { max = rec[i].score; } } my_sort(rec, n); printf("最高点:%3d\n", max); printf("最低点:%3d\n", min); printf("平均点:%5.1f\n", (double) sum / n); for (i = 0; i < n; i++){ printf("%3d\t%s\t%s\n", rec[i].score, rec[i].code, rec[i].name); } return(0); } my_sort.hの中身 typedef struct { char code[7]; char name[21]; int score; }REC; void my_sort(REC *rec,int n); バブルソートで整列 #include <stdio.h> #include "my_sort.h" #define MAX 50 void my_sort(REC *rec, int n){ for(i = 0;i < n - 1; i++){ for(j = n - 1;j > i;j--){ /*この中身が問題----1*/ } } } 1の部分でchar codeとchar nameとint scoreの値を交換するときにどうすればいけるでしょうか?ご教授ください。

  • 構造体のポインタの動作及びそれ故書けない関数

    こんにちは.c言語でのstructureのポインタについての質問,及びその動作ゆえに自分のやりたい書き方ができないので,アドバイスをお願いしたいと思います. まずは,structureのポインタを使った計算が謎の動きをするので,説明して頂けたらと思います.ubuntu 12.04 64bit, コンパイラはgcc 4.6.3, ただg++でやっても同じ動きでした. #include <stdio.h> int main(int argc, char **argv) { struct state_ { double pos[3]; double att[3]; }state = { { 1.0, 2.0, 3.0 }, { 4.0, 5.0, 6.0 }, }; double *state_ptr; state_ptr = &state.pos[0]; printf("%f\t%f\t%f\t%f\t%f\t%f\n", *state_ptr, *(++state_ptr),*(++state_ptr), *(++state_ptr), *(++state_ptr), *(++state_ptr)); double *pos_ptr, *att_ptr; pos_ptr = &state.pos[0]; att_str = &state.att[0]; printf(“head of pos %f, head att %f\n”, *pos_ptr, *att_ptr); return 0; } こうすると,結果は 6.000000 6.000000 6.000000 6.000000 6.000000 6.000000 head of pos 1.000000, head of att 4.000000 はて,どうなっているのでしょうか?少なくとも1行目の最初の6.0はpos[0]の1.0のはずなのでは? ちなみに-Wallをつけると, struct_double_pointer_test.c:17:54: warning: operation on ‘state_ptr’ may be undefined [-Wsequence-point] が出ます. また,++state_ptrをstate_ptr++に変えると結果は 6.000000 6.000000 5.000000 4.000000 3.000000 2.000000 そして -O2をつけると 6.000000 5.000000 4.000000 3.000000 2.000000 1.000000 基本的にメンバーの順番がひっくり返ってますね.これは一体どういうことなんでしょう?undefinedと言われてるから何が起こっても変じゃないでしょ,と言われればそうなんですが,何かなっとくのいく説明があれば嬉しいです.pos_ptr, att_ptrで単体で出すと正しく出るので,*(pointer++)の動作がundefinedってことなんですよね?僕は 1.0 2.0 3.0 4.0 5.0 6.0 となってくれると思った訳です.(ちなみにMacOS gccではこうなりました)structureの中で順番に上からアドレスが振られると思ったので.そして2番目の質問に移る訳ですが,上記の僕の予想通り動いた場合,2つ構造体のポインタを渡して,順番に中身を積分させていくような計算が以下のようにできると思いました. void integrate(struct state_ *x, struct state_ *dx, num_of_double) { const float timestep = 0.01 int i; for(i=0; i<num_of_double, i++){ *x += *dx*timestep; x++, dx++; } } 両方きれいに順番がひっくり返るなら上の書き方でも積分させた値は同じになるからいい?とは言えど怖くてもちろん使えません.こういう計算をさせる場合は,構造体のポイタを渡さずに配列ごとに計算させるんですかね?&pos[0]と&pos_dx[0]を渡すなど?一般的にどういう書き方をするものなのかが知りたいです.

  • C言語のchar ポインタ

    char ポインタで分からないことがあるのですが・・↓ ------ { char array[7]; char *ptr; strcpy(array, "abcdef"); ptr = &(array[0]); printf(" array = %s\n ptr = %s\n", array, ptr); } ------ これを実行して, array = abcdef になるのは分かるのですが ptr = abcdef  になるのはどうしてでしょうか。 ポインタはアドレスを指し示すものですよね。だったら ptr = にはarray[0]のアドレス('a'のアドレス)が入るのでは 無いんでしょうか・・?