• ベストアンサー

ファイル内の文字列を配列へ

テキストファイルの中の文字列を1字づつ配列に入れたいのですが、どのように書けばよいでしょうか? while((c=fgetc(fp)) ! = EOF){ c=rv[i];   i++; } 一応このようにやってみたのですが、ダメなようです。

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★1文字ずつ配列に入れる必要ないと思いますけど。 ・次の質問の続きですよね。  http://oshiete1.goo.ne.jp/qa3233269.html→『構造体、ファイル処理のプログラム』  ↑  この質問は英字文字を検査して用意された A-Z のカウンタをインクリメントすれば  良いだけですので配列に入れる必要はないです。 >一応このようにやってみたのですが、ダメなようです。  ↑  ダメとはどう駄目なの?  多分はセグメントエラーになるのでしょうかね。  配列の容量が不足しているからじゃないの? ・だから配列にいれずに >// 読み込み >while ( (c = fgetc(fp)) != EOF ){ > if ( isupper(c) ){ >  stat[ c - 'A' ].count++; > } > else if ( islower(c) ){ >  stat[ c - 'a' ].count++; > } >}  ↑  このように文字を検査してカウントしていけばよいだけだ。 ・以上。

参考URL:
http://oshiete1.goo.ne.jp/qa3233269.html
blade3322
質問者

お礼

なるほど、まだ初心者でisupperなどの存在は知らなかったです。 詳しい説明ありがとうございました。

その他の回答 (1)

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

配列「に」入れたいのでしたら、 > c=rv[i]; これは左右両辺が逆です。

blade3322
質問者

お礼

こんな簡単なミスをしてしまうとは・・・ ありがとうございます。

関連するQ&A

  • 配列のサイズ変更

    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を大きめにとっておいて配列に格納し終わったら余った空の配列を削除する、という機能を拡張したいのですがどのようにすればいいかわかりません。 どなたか教えていただけないでしょうか?

  • txtファイルの文字を配列に格納

    ファイル関数を使ってoutput.txt(txtファイル)の文字を配列に格納するプログラムを作っているのですが、配列に文字を入れられない状態です。 ※参考になるページやアドバイスがあれば宜しくお願い致します。 ■プログラム #include <stdio.h> void main(){ int i; int data[10]; FILE *fp; fp = fopen("output.txt","r"); if(fp == NULL){ printf("ファイルが見つかりません。"); }else{ for(i=0;fp != EOF;i++){ data[i] = fgetc( fp ); } } } ■output.txt 001 100 猫A 好きな物 ねこまんま 002 200 猫B 好きな物 キャットフード

  • C言語 文字列格納

    テキストファイルから整数データ又は文字列を読み込んで配列に格納する動作についての質問です。 テキストファイルが1行区切りの整数型なら1次元配列で for(i = 0; i < maxSize; i++) { fscanf(fp,"%d", &data[i]); } テキストファイルが1行区切りの文字列なら2次元配列で for(i = 0; i < MAXSIZE; i++) { if (fscanf(fp,"%s", &data[i][300]) == EOF) break; } for(j = 0; j < i; j++) printf("%s\n", data[j]); みたいな具合に格納できたんですが、 テキストファイルが1行区切りのデータではなく、空白文字区切りの文字データだった場合、それぞれどのようにして配列に格納すればいいかがわかりません。 イメージとしては、1文字目から見ていって空白が出ればそこで切って格納していくというかんじなのですが・・・ 質問の内容がわかりにくいかもしれませんが、是非教えてください。お願いします。

  • 文字列と文字列をつなげるには

    下記のようにプログラムを作りました。 簡略しているのでわかりづらいと思いますが、 文字の配列と文字の配列を文字の配列に格納したいので、 下記のように$arrayに”.=”として文字列を加えて いますが、うまくいきません。 どのようにしたらいいのでしょうか? ご教授お願いいたします。 while($text[$i] != ""){ if($i==1){ $array[$j] = $feild[$j]; $array[$j] .= " "; $array[$j] .= substr($text[$i], $no, $pos); } }

    • ベストアンサー
    • PHP
  • C++でcsvファイルから文字列を取得するのに

    C++でcsvファイルから文字列を取得するというものを作っているのですが、うまく取り出すことができません。ファイルはオープンできて、文字列にも分けられているのだとは思うのですが、どこのデータを表示させても"1aa"としか表示されません。なにも格納されていない所は"1aa"とは表示されず空白ですが。 以下に取り出す際使用しているコードを記載するので、うまい具合にいくアドバイスがありましたらお願いします。 ↓で格納させる場所を作っています。 typedef struct { char* Input; char* Output; char* AddName; char* Path; char* LED; int VS; char* Title; char* Copy; } csvdata_t; csvdata_t csvdata[100]として別の場所で宣言してます ↓この関数で格納させています void loadData(){     FILE *fp;    fp = fopen(csvTitle,"r");//ここでのファイルパスは通っています    int n,num,i;        int input[1024]; char inputc[1024]; for(i = 0; i < 1; i++)//最初の1行読み飛ばす while(fgetc(fp) != '\n'); n = 0; num = 0; while(1){ for(i = 0;i < 64; i++){ inputc[i] = input[i];// = fgetc(fp);//1文字取得する input[i] = fgetc(fp); if(inputc[i] == '/'){//スラッシュがあれば while(fgetc(fp) != '\n');//改行までループ i = -1;//カウンタを最初に戻して continue; } if(input[i] == ',' || input[i] == '\n'){//カンマか改行なら inputc[i] = '\0';//そこまでを文字列とし break; } if(input[i] == EOF){//ファイルの終わりなら goto EXFILE;//終了 } } switch(num){ case 0: csvdata[n].Input = inputc;break; case 1: csvdata[n].Output = inputc;break; case 2: csvdata[n].AddName = inputc;break; case 3: csvdata[n].Path = inputc;break; case 4: csvdata[n].LED = inputc;break; case 5: csvdata[n].VS = atoi(inputc);break; case 6: csvdata[n].Title = inputc;break; case 7: csvdata[n].Copy = inputc;break; case 8: break; } num++; if(num == 9){//9まできたら num = 0;//0に戻す n++;//次の行へ } } EXFILE: fclose(fp); }

  • テキストファイルから文字列を読み込んで二次元配列に格納するには

    毎回お世話になっています。 ただいまC言語を勉強中の学生です。 基本的な文法は頭に入れたつもりでしたが、まだポインタと ファイルの入出力に苦手意識があり 実際うまくできないでいるので どなたか ご存知の方にアドバイスいただければと思って書き込ませていただきます。 今回練習しているのは 先に述べたように、テキストファイルに abc def ghi jkl などと文字列を書いておき、そのファイルを読み込んで 二次元配列に格納したいのですが、何を勘違いしているのか、 うまく実現できません。 参考書などを見て 一次元配列へ格納する場合は できたようなのですが、今後このプログラムを発展させる段階で 二次元配列に文字列を 格納できたほうが好都合なので 今模索しています。。。 ちなみに 一次元配列に格納する場合は 以下のように書きました。 #include<stdio.h> #include<stdlib.h> main() { char a[10]; FILE *fp; fp = fopen("word.dat", "r"); if (fp == NULL) { printf("File does not exist.\n"); exit(1); } while(fscanf(fp,"%s",a)==1){ printf("%s\n",a); } fclose(fp); return 0; } 実はコレに関しても分からない点があり、それは 目的の配列変数 a[]に格納できたのだから それを確認したいと思い printfで a[0]~a[10]を表示してみようとしたところ 変に文字化け したものが表示されたり、何も表示されなかったり よく分からないことが起きます。私は何を勘違いしてしまっているのでしょうか(>_<) 長々と書いてしまいましたが、今回 御教授いただきたいのは (1)、テキストファイルから 英字の文字列を読み込んで二次元配列に格納するために用いるのに 一番最適な関数はどれか(fscanfやfgetsなど) そして、その関数を使って 一番シンプルな記述をするにはどのように記述すればよいのか (2)、上のようなプログラムの書き方で、配列aにテキストファイルから読み込んで格納できたようなのに、a[0]~a[10]をprintfしたときに うまく中身が表示されないのはなぜか。 という点なのですが、(1)をとりあえず急いでおりますので、(2)はおまけ程度に考えていただければと思います。 なぜかファイルの入出力がいまだに把握できなくて苦手としておりますので、どうか よろしくお願いいたします。

  • 大文字を小文字に変換するプログラム

    if((fp4 = fopen("sample.txt","r")) == NULL){ printf("can't open\n"); return(-1);//強制終了 } else{ while((c=fgetc(fp4))!=EOF){/*EOFまでfp4に入力*/ if(isupper(c)){ c=tolower(c); printf("%s",c); } else printf("a"); //確認用 } } ファイルから文字を読み込んでctype関数を使って大文字から小文字に変換したいんですがうまくいきません。 コンパイルしても確認用が反応しないんでおそらくどこか間違ってると思うんですがわかりません。 ご教授宜しくお願いします。

  • 改行までの一文字ずつのファイル読み込み

    こんにちは。 C言語で現在ある入力ファイルを読み込んで計算し、 ファイルを出力するというプログラムを作成中なのですが、 ファイルを読み込む場合に、 改行までの値を一文字ずつ読み込むという作業をさせたいと思っています。 データは、 abc defgh ijk ..... といった感じで入力されており、 while((c = fgetc(fp)) != '\n'){ fscanf(fp, "%c", &q[i]); } と書いたのですが、セグメント例外が出て強制終了してしまいます。 初歩的なことで申し訳ないのですが、教えていただきたいと思います。よろしくおねがいします。

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

    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; } 特に動的確保のところがよく分かりません。 回答よろしくお願いします。       

  • 文字列のある行数を表示する

     お世話になっています。  前回、文字列の検索の質問をしたものです。  このプログラムは文字列を入力して、ファイルから文字列を検索する。  そして、検索した文字列の総数と、存在する行数目を出すというものです。    現状の問題は、検索した文字列の総数は出るようになりました。      しかし、存在する行だけを出したいのに、全ての行数目を      出してしまいます。           どのようにすれば検索した文字列のある行数目だけを表示できるようになるのでしょうか。  以下、現在のソースの状態です。 #include <stdio.h> #include <fstream> #include <iostream> #include <stdlib.h> #include <string.h> #define FALSE 0 #define TRUE 1 using namespace std; int main( ) { FILE *fp;//ファイルポインタ char filename[256];//ファイル名 char key[128];//検索文字列 char key2[128];//見つけた文字列の保存 int iCnt[128];//見つけた文字 char c;    int keylen;//検索文字列の長さ int i = 0;//検索文字列の位置 int search = FALSE;//検索中フラグ int count = 0;//検索文字列出現回数 int j = 0; //検索対象ファイル名と検索文字列をコンソール入力 cout << "ファイル名を入力してください⇒  "; cin >> filename ; cout << "検索文字列を入力してください⇒  "; cin >> key; keylen = strlen(key); if((fp = fopen(filename,"r")) == NULL)     { cout << "ファイルオープンエラー\n" ; exit(1); } //ファイル読み込み while((c = fgetc(fp)) != EOF) { if(search) {//検索中       //検索文字列に一致しない文字が現れた    if(c != key[i]) { search = FALSE; i = 0; } else{  i++; } }   else{ //検索中ではない if(c == key[i]) { search = TRUE; i++; } }     //検索文字列と全て一致した場合 if(keylen == i) { count++; i = 0; iCnt[i] = 1; search = FALSE; } } fclose(fp); cout << "出現回数は " << count << '\n'; //ファイル(filename)からの読み込み        ifstream ifs(filename); string buf; while(getline(ifs, buf) && ifs ) { // ここで行目数の処理を行っています。 j++; if((count++ && search = FALSE) == TRUE) { cout << j << "行目" << endl; } } return 0; }

専門家に質問してみよう