• ベストアンサー

文字列をポインタに

文字列型のデータをポインタ型のエリアに代入したいのですがどうしたらよいでしょうか? char path[256]; char *INPUTFILE; 「char path」に"c:\windows\temp\inputfile.txt"という、入力ファイルへのパスが格納されているとします。 このデータを「char *INPUTFILE」に入れたいのです。 もしくは「char path」のデータを使って、ファイルをOPENさせる方法を教えてください。(この訊き方のほうがよかったかな?)

質問者が選んだベストアンサー

  • ベストアンサー
  • selenity
  • ベストアンサー率41% (324/772)
回答No.3

ああっ、勘違い、、、でした、、、 INPUTFILE=(char *)malloc(strlen(path)+1); strcpy(INPUTFILE, path); でpathの中身をINPUTFILEへコピーできます。 最後に使いおわったら、 free(INPUTFILE); も忘れずに! でも、本当に「型が違ってエラー」なのでしょうか? なんとなくpath内の「\」のエスケープのし忘れでファイルが見つからないなんてことは無いですよね?

techtak
質問者

お礼

私も勘違いでした。 INPUTFILE = path; で、出来ました。スイマセン(^^; 「\」のエスケープのし忘れはないのでご安心を。 mallocの方法も参考になりました。 何度もアドバイスしていただいて、ありがとうございました。 また、よろしくおねがいします。

その他の回答 (2)

  • tailkuppa
  • ベストアンサー率53% (52/98)
回答No.2

fopen の第一引数の型は const char * なので、 本当にこの宣言をしているのであれば、 fp = fopen(path, "r+b"); の書き方でまちがいないはずです。 というか、 char * INPUTFILE; であるならば、 INPUTFILE = path; fp = fopen(INPUTFILE, "r+b"); でも同じになるはずです。 (もしかすると、 fp = fopen((const char *)path, ... とかする必要がある?) INPUTFILE = path; は、データの入っている場所の先頭(path == &path[0})をINPUTFILE という場所専用の変数に代入していることになります。 もし、path[256] の中身を char path[256] = "c:\windows\ ..."; のように設定しているのであれば、 char path[256] = "c:\\windows\\ ..."; にする、とかが必要かも知れません。 C の処理系(パス名から察するにWindows の処理系?だと全然知らないのですが) と、具体的なソース、それに「型が違う」と言われたメッセージの中身をくわしく教えていただけると、もうすこし具体的なお答えが返って来ると思います。

techtak
質問者

お礼

すみません! INPUTFILE = path;できました。(^^; 以前同じようなことをした時、なぜかコンパイルエラーになったので 出来ないものだと思ってたんです。 fp = fopen(path, "r+b");でも出来るとのことですが、 pathはポインタ型で宣言してないので、やはり出来ないです。 それからパスの中身は char path[256] = "c:\\windows\\ ..."; にしてますのでこちらは大丈夫です。 たいへんお騒がせしました。 アドバイスありがとうごさいました。

  • selenity
  • ベストアンサー率41% (324/772)
回答No.1

fp=fopen(path,"r+b") でファイルを開き、 fread(INPUTFILE, 1, filesize, fp) で読み込みます。 最後に忘れずに fclose(fp) でファイルポインタを開放します。 ただし、INPUTFILEはファイルを格納するのに十分なサイズが確保されている必要があります。

techtak
質問者

補足

char pathでは型が違ってエラーとなってしまうので、 char *INPUTFILEに代入したいのです。 つまり、 fp=fopen(INPUTFILE,"r"); /*「INPUTFILE」には入力ファイルへのパスが格納されている。*/ というような文でファイルをopenさせたいのです。 ちょっと、説明が足りなかったですね(^^; すみません。

関連するQ&A

  • 文字列の動的確保とポインタ配列について

    C言語についての質問です。 現在、キーボードから文字列を読み込みファイルに保存するプログラムを作成しています。 プログラムの条件は、以下の通りです。 1: キーボードから英数字(最長でMAX_LEN(1000)-1文字)を入力して文字列(文字配列)dataに格納後、画面に表示する。 2: 入力された文字列と同じ長さの文字列を格納する領域を動的に確保し、文字列dataをその領域に コピーする。なお、必要な文字配列の長さは文字列の長さ+1バイトである。 3: 文字列endが入力されるか、入力された文字列がNUM_STRING(10)個になるまで1~2の処理を繰り返す 4: 各文字列へのポインタを格納する(char *)型ポインタの配列str_p(サイズ:NUM_STRING)を定義して利用する。 5:1~2の処理が終了した後で、メモリに格納されたすべての文字列をファイルに出力する。ファイル名はoutput.txtとし、最初の行に文字列の個数を、次の行以降に入力された順番と「逆の順番」で文字 列を出力すること。 実行例 input ->st22 st22 input->st1 st1 end ファイルの中身 2 st1 st22 現在完成しているプログラムは以下の通りです。 #include<stdio.h> #include<string.h> #include <stdilb.h> #define NUM_STRING 10 #define MAX_LEN 1000 int main (void) { int n, i; char data[MAX_LEN] = {}; char *str_p[NUM_STRING]; FILE *fp; do { printf("input->"); scanf("%s", data); if (strcmp(data, "end") == 0) { break; } else { printf("%s\n", data); n++ 2の処理 } while(n <= NUM_STRING); if ((fp = fopen("output.txt", "w")) == NULL) { fprintf(stdout, "File open error\n"); } fprintf(fp, "%d\n", n); for (i = n-1; i>0; i--) fprintf(fp, "5s\n", str_p[i]); fclose (fp); return 0; } 特に動的確保のところがよく分かりません。 回答よろしくお願いします。       

  • ポインタに文字列を代入した場合、メモリはいつ開放されるか。

    C言語で、 char *p = "abcd"; の様にポインタに文字列を代入した場合'a','b','c','d','\0'が格納されているメモリ領域はいつ開放されるのでしょうか。 また、このような文字列は、 *(p + 2) = 'f'; というふうに後から一部の値を変更することはできるのでしょうか。 的外れな質問かもしれませんがよろしくお願いします。

  • C言語で文字列をポインタ名にしたい

    C言語で文字列をポインタ名にしたい 題名のとおりですが、C言語で文字列をポインタ名にする方法はありますか? 具体的にはxの配列の個々の要素を、計算回数による計算結果の推移をファイルに出力したいと考えています。 ファイル名は「test_x_1.data」、「test_x_2.data」、…「test_x_50.data」のようになっています。 (要素分のファイルを作成するということです。) ここでそれぞれの「test_x_1.data」、「test_x_2.data」、…「test_x_50.data」には、 x[i]の計算回数と計算結果が格納されていますが、 現状では、fopenとfcloseを計算回数分繰り返しているため、計算時間がかかってしまっています。 よって、計算を行う前の最初にfopen、最後にfcloseを行うようにしたいのですが、 ファイルポインタを開く作業を手動で行うと、xの要素分ファイルポインタを用意しなくてはならなくなります。 (現状のようにファイルポインタを使いまわすのではなく、 要素分(=ファイル数)のファイルポインタを、常に開きっぱなしにしたいということです。) そのため、文字列をポインタ名にすることで、その作業を自動で行えるようにできればと考えています。 実際にchar型の配列が文字列になっているため、「FILE *buf」のように宣言しようと試みたのですが、 bufは既に文字列型の配列として宣言されているため、使用することができませんでした。 (文字列そのものをファイルポインタ名にできなくても、 この場合、要素数分のファイルポインタを自動で用意できれば問題ないのですが…) 下は簡単なプログラム例です。詳しい方のご助言を戴ければ幸いです。 よろしくお願い致します。 -------------------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <math.h> #define CAL 10000 /*計算回数*/ #define ELE 50 /*配列の要素数*/ #define NUM_CHAR 20 /*char型で確保する文字数*/ int i,j,n; /*forループ用*/ double x[ELE]; /*計算結果の配列*/ char buf[ELE][NUM_CHAR]; /*文字列*/ int main(void){ char filename[] = "test_x_"; char fileext[] = ".data"; /*「test_x_数字.data」という文字列の出力*/ for(i=0;i<ELE;i++){ sprintf(buf[i],"%s-I%d%s",filename,i,fileext); } for(n=1;n<CAL;n++){ /*計算部分*/ for(i=0;i<ELE;i++){ x[i] = 2*n+i; } /*ファイルに出力*/ for(i=0;i<ELE;i++){ FILE *fp; /*このファイルポインタ名を要素数分用意したい*/ if(n==1){ if((fp = fopen(buf[i],"w"))==NULL){ printf("The program can't create a file. : buf[i] \n"); exit(1); } } if(n>=2){ if((fp = fopen(buf[i],"a+"))==NULL){ printf("The program can't read a file. : buf[i] \n"); exit(1); } } fprintf(fp,"%d %f\n",i,x[i]) fclose(fp); } } return 0; } --------------------------------------------------------------------------------

  • 文字列取得

    '/path1/path2/file1.txt' '/path1/path2/path3/file2.txt' 上記のようなpathがあった場合にファイル名(拡張子なし)の 文字列を取得したいのですがどのように良いでしょうか? 宜しくお願い致します。 awkで$4と指定すれば「file1.txt」の文字列を取得できるのですが パスの長さが定まっていないため$4ではなく最後の文字と指定する 記号はないでしょうか? echo /path1/path2/file1.txt |awk '{FS="/"; print $4}'

  • CHAR型ポインタについて。

    CHAR型ポインタについて。 当方C言語初心者です。 ポインタと文字列の関係分からないことが出てきました。 参考にしている本があり、そのページに下記のソースで「const char *pc1」のポインタ変数を用意して、そこに直接文字列を代入しています。 本来、「char *pc1」はchar型のアドレスを格納するための変数のはずなのに、その変数に文字列を代入してることに疑問を感じました。 この記述の仕方は間違っていないのでしょうか?また、アドレスを格納するための変数「*pc1」に「abcdefg」の文字列はどのようにメモリ上で格納されているのでしょうか? 知ってどうなるの?みたいな質問かもしれませんが、ご教授いただけると幸いです。 #include <stdlib.h> #include <string.h> void func(void) { const char *pc1 = "abcdefg"; //←ココ char *pc2 = (char *)malloc( strlen(pc1) +1); if ( pc2 ) { strcpy( pc2, pc1 ); free( pc2 ); } }

  • charポインタへの文字列による動的確保

    char *c=new char("abcd"); のようにして、cに"abcd"のポインタを代入しようとしたのですが、 error C2440: '初期化中' : 'const char [5]' から 'char' に変換できません。 と出てきてうまくいきません。 どの様にすれば、メモリ確保と同字に文字列で初期化できるのでしょうか?

  • C言語の文字列について

    C言語で文字列のヌルについて、理解があいまいな点があり、教えて欲しいのですが、以下のようにsprintfで書式し代入した際に最後は0(ヌル文字)をセットしてくれるのでしょうか?4バイト目の文字が何か知りたいです。 char temp[100];時では0で初期化されていることは保障されていませんが、大抵は0で埋まっていますが、sprintfの仕様が知りたいです。 char temp[100]; sprintf(temp, "test");とした時に 01234バイト目 test?????????????.... 話は変わりますが、以下のようにするとエラーになりましたが、 特定の位置の値をセットする方法はどのようなものがあるのでしょうか? temp[10] = (temp[10] == '0') ? (char)'1' : (char)'0';

  • char型のポインタ配列に変数の値の代入できる?

    c言語でchar型のポインタ配列に変数の値を代入できるのでしょうか? 例えば int A[10]={1,2,3,4,5,6,7,8,9,10}; char *C[10]; のCに配列Aの中のデータを文字列として入れたいのです。 C[0]="A[0]"としてもA[0]という文字列が代入されてしまうだけなので… よろしくお願いします。

  • 文字列と整数型について

    はじめまして。 どうしても困っているのでヒントでも良いのでおねがいします。 関数内(func1)で確保した文字列変数のポインタを 別の関数(func2)にポインタ渡しします。 func2内で整数型で計算した結果を引数で示された文字列変数に 代入するというようなことをしたいと思ってます。 ここで、intは4byteとします。 メモリ長だけで見ると、bit[4] = tmp です。 void func1(){ char bit[4]; func2(bit); return; } void func2(char* p){ int tmp = 0x10101100; p = tmp; <---- ??? return; } そこでどのようにすれば、 代入することができるのか分かりません。 以下のような結果になるように代入したいと思っています。 bit[0] = 0x10; bit[1] = 0x10; bit[2] = 0x11; bit[3] = 0x00; 小さな文字列型に整数型をどのように渡せばよいのかが 一番疑問に思っているところです。 整数型に文字列型を代入する場合には 文字列のバイト指定とシフト演算で実現できています。 ヒントでもよいのでお願いします。

  • 文字列を表すための配列とポインタ

    文字列を表すための配列とポインタ  配列とポインタは同様に扱えるもの、と思って、次のプログラムを作りました。処理系は、Visual Studio 2010 コマンドプロンプトです。 #include <stdio.h> void main(void) { char a[256]; char *b; printf("文字列を入力してください。\n"); printf("例「abcde」\n\n"); printf("配列型文字列を使います。\n"); scanf("%s", a); printf("文字列は%sです。\n\n", a); printf("ポインタ型文字列を使います。\n"); scanf("%s", b); printf("文字列は%sです。\n", b); }  すると、まずコンパイル時に、 「warning C4700: 初期化されていないローカル変数'b'が使用されます」 と表示されました。そして、実行すると、「配列型文字列」の方は問題ないのですが、「ポインタ型文字列」の方の実行後に、 「x.exeは動作を停止しました。 問題が発生したため、プログラムが正しく動作しなくなりま した。プログラムは閉じられ、解決策がある場合は Windowsから通知されます。」 と表示され、エラーとして終了してしまいます。 「char *b;」 と宣言するところが問題のようですが、なぜなのかが分かりません。どなたか、解説をお願いします。