• 締切済み

文字列をファイルから検索する

gsdhkfghsdbfdbnsjkfndjsandfjaghfdsafdsafdsag dbsahfgjaf fdjashfjdnsajfndjbreakfdjsabdhkasb dslihfldsajfkldjsaklfndgbhfbrnsajkgbnfdjkanfjdn sdhfjkhskagfeabrrfajkgkjdshfjhjlsagnfrjsergnre fkdhsalkjdfjsabngkrehgufjkdsngjkeshgkjernsjklgn idslfgdhsajkghbrkeubhgjkdbnsjgfndjsngrjklnfjl inportantjldsghdfksghnjkdfnjfnhlsdghnlrjensgl jshdfbnjkgnbfdjksgjkfdjskgnfjkdsngjkfnsdjgnfkls dbksafbgdskafdjksaf important gyjkgbjkbkjbfgyjbuk jkhbjkbnfsdkjzfbvdkszbkdjsbfdks ifkldsgjkfnsal klfjszdklgfdklsgn kfjagklf gkorhjsglfnsl o;sjag;ra kflhgsglfjnglfdnsgklirejsigjrtklesgkrtm kfjsdglkjklsdgg lf;jgr;ejsig;lrnesigrtjniesjgesgi ↑「ser.txt」 今、ファイル操作を勉強しているんですけどこの問題がどうしても解けません上の文字列から「important」という文字列を検索して見つかったその場所を「111111111」に置き換えたいんですけど本当にわかりません fseekっていうのを使うと思うんですけど・・・・ #include< stdio.h> #include< stdlib.h> void main(){ FILE *fp; char a[]={"important"}; int i,j; if((fp=fopen("ser.txt","r+"))==NULL){ printf("error\n"); exit(1); } ??? ここからがわかりませんTT

みんなの回答

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

では敢えて、とっても効率の悪い実装例を。 a. fopen()でser.txtを開く b. ファイルの読み出し位置をfseek()でセットする。1周目はser.txtの1文字目("g"の字)、2周目は2文字目("s"の字)…のように c. "important"という文字列はの長さは9バイトなので、fread()を使って9バイト読み出す d. cで読み込んだデータの長さが9バイトに満たなかったら、これ以上検索しても無駄なのでfclose()でser.txtを閉じて終了 e. cで読み込んだデータが"important"という文字列と一致しているかどうかをチェック、もし一致していなかったらbへ戻る f. 目的の文字列が見つかったので、先ほどcでデータを読み出した位置を今度はファイルの書き込み位置にセットする g. fwrite()で置き換える文字列を書き込む h. bへ戻る

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

ser.txtの内容がファイルではなくメモリ内にあったとして、文字列を見つけてメモリ内で置換する方法は分かりますか? あとついでに、void main()はお勧めしません。言語仕様的にはint main(void)とすべきです。

bxcbvfg
質問者

補足

メモリ内というのはどういうことですか・・・すいません馬鹿なもので void main()はint main(void)にしたほうがいいんですね ありがとうございます

関連するQ&A

  • 文字列での判定

    ファイルポインタの勉強を始めました。 練習として「入力された文字列をsave.txtに保存するただし、endが入力された場合、ループを抜ける」というプログラムを書きたいのですが、うまくできません。結果的には aiueo,kakikukeko と二つの文字列を出力したいです。 見にくいソースですが、ご教授の方、お願いします。 #include <stdio.h> #include <stdlib.h> main(){ FILE *fp; char input[256],input2[256]; if((fp=fopen("save.txt","at"))==NULL){ fprintf(stderr,"ファイルオープンに失敗しました"); exit(1); } do{ printf("文字列を入力してください"); scanf("%s",input); scanf("%s",input2); fprintf(fp,"%s,%s",input,input2); }while(input!="end" || input2!="end"); }

  • ファイルから文字列を読み出して16進数に変換

    test1.txtというファイルから文字列を読み出して16進数に変換、という処理をしたいのですがうまくいきません。どこがどう悪いのでしょうか?ご教授のほどお願いします。 ---------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { FILE *fp; char *fname = "test1.txt"; char str[100]; int num; fp = fopen( fname, "r" ); if( fp == NULL ){ printf( "%s is not open.\n", fname ); return -1; } while( fgets(str, 100, fp ) != NULL ){ num = strtol(str, NULL, 16); printf( "%s", str ); printf("%x\n", num); //ここでうまく出力されません } fclose( fp ); return 0; } ---------------- ちなみに、test1.txtの中身は以下のようになってます。 44DB4147E6075A92E878EB68C44DD51F 5DCE86622D846BF272215A792AF31A3E 46FF69A29D3DF1D4842461B239256C26

  • fopenのモード文字列について

    fopenのモード文字列が w の時について何ですが、 #include <stdio.h> int main(void){ FILE *fp; fp=fopen("test.txt","w"); fclose(fp); return 0; } でファイルを作成した時 作成したファイルと同じディレクトリーに同じ名前のファイルが 存在するときは元のファイルに上書き(?)してファイルが作成されますよね? これは1度元のファイルを削除してから新たにファイルを作成しているのか、それとも元ファイルを空にしただけなのでしょうか?

  • fseekの使い方

    C言語で、 #include "stdafx.h" #include <stdio.h> void main(void) { FILE *fp; fp = fopen("text.txt", "a+"); fseek(fp, 0L, SEEK_SET); fputs("0\n12345",fp); fseek(fp, 0L, SEEK_SET); fputs("6\n789",fp); fclose(fp); } と書き、text.txtに abcde と書いてあるとします。 私の目論見では、a+で開いている為ファイルの最後から書き始めるとしても、 fseekで最初に戻るので、実行すればtext.txtの中身は 6 78945 になると考えていたのですが、 結果は abcde0 123456 789 となりました。 fseekをいじって-3Lとかにしてみたのですが、fseekによって書き込む位置が動いている様子がありません。 fseekの使い方が間違っているのでしょうか? ちなみに環境はWindowsXPで、Visual C++ 2008で行っています。

  • 続jファイルに文字列を書く

    あれから後一歩と言うところにきました たぶんmallocのバグだと思いますがチャットのシステムを作ろうとしているのですが 読み込み時にエラーになります ソースの注目部分を見てほしいのですが、 注目部分はbuf+1 にすると 文字列が1文字ずつ消えていくバグになり bufにすると 3行目を書き込んだ時点で3行目がの頭の部分の文字列がおかしくなり4行目を書き込もうとするとエラーになります ちゃんと動作するにはどのように書けば良いですか? ---ソース--- #include <stdio.h> void main(void){ FILE *fp; char *tm[1000]; char buf[400]; int i=1,sei; fp= fopen("now.txt","w+"); fprintf(fp,"もも"); fclose(fp); //何で最初に書き込んでるんだ? //という突っ込みがあるでしょうが本当に作りたいプログラムは最初にファイルに書き込まないといけないためです。 fp= fopen("now.txt","r"); while( fgets( buf, 400, fp ) != NULL ){ tm[0]=(char*)malloc(strlen(buf)+1); strcpy(tm[0], buf); } fclose(fp); fp =fopen("moto.txt","r"); while( fgets( buf, 400, fp ) != NULL ){ tm[i] = (char*)malloc(strlen(buf+1)); strcpy(tm[i], buf+1); //ここを注目 if(i<999){ i++; } } fclose(fp); if(i<=1000){ sei=i; } else{ sei=1000; } fp =fopen("moto.txt","w"); for(i=0;i<sei;i++){ if(i==0){ fprintf(fp,"%s\n",tm[0]); } else{ fprintf(fp,"%s",tm[i]); } } } ---now.txt--- もも ---moto.txt--- オレンジ みかん

  • Cプログラミングの質問なのですが,

    Cプログラミングの質問なのですが, 以下のプログラムで正規乱数を発生させたいのですが,どこがおかしいのでしょうか? fp1のransuuはきちんとtxtで作成されています。 至急お助けください。 #include <stdio.h> #include<stdlib.h> #include<math.h> #define PI 3.141592653589793238 int main (void) { FILE *fp1,*fp2; int i,n; unsigned int x1,x2; double y1,y2; fp1=fopen("ransu.txt","r"); fp2=fopen("seikiransu.txt","w"); for(i=0;i<n;i++) { fscanf(fp1,"%lf",&x1); fscanf(fp1,"%lf",&x2); y1=sqrt(2)*sqrt(-2*log(x1))*cos(2*PI*x2); fprintf(fp2,"%lf\n",y1); } fclose(fp1); fclose(fp2); return 0; }

  • ファイルを読み込んで条件式を満たさない

    ファイルを読み込んで一部の文字列が来たら別のファイルの文字列を書き込んでもらうプログラムを作ろうとしたのですが、何故かifを使って条件分岐を試みたところ分岐してくれません。 どのようにしたら分岐しますか? 出来ればソースもお願いします。 ---ソースの内容--- #include <stdio.h> #include <string.h> void main(void){ FILE *fp,*fp2; char buf[100],buf2[100]; fp=fopen("yasa.txt","r+"); while( fgets( buf, 100, fp ) != NULL ){ if(strcmp(buf,"じゃがいも")==0){ fp2=fopen("kuda.txt","r+"); while( fgets( buf2, 100, fp2 ) != NULL ){ printf("%s",buf2); } fclose(fp2); } else{ printf("%s",buf); } } fclose(fp); } ---ソースここまで--- ---yasa.txtの内容--- きゃべつ にんじん じゃがいも だいこん セロリ ---yasa.txtここまで--- ---kuda.txtの内容--- もも オレンジ みかん ぶどう ---kuda.txtここまで---

  • ファイルからの読み込み(初心者)

    #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; char s[256]; if ((fp = fopen("memo.txt", "r")) == NULL) { printf("file open error!!\n"); exit(EXIT_FAILURE); } while (fgets(s, 256, fp) != NULL) { printf("%s", s)         } fclose(fp);         return 0; } というファイルから1行読み込むというプログラムなのですが いくらやってもファイルが開けませんにしかなりません。 ファイル名の所が間違ってるのだとは思いますが・・ ファイルはメモ帳で作った簡素なファイルで ファイル名:memo ファイルの種類:テキスト文書(*.txt) 文字コード:ANSI 保存場所はデスクトップ です どうすれば開けるようになるのでしょうか。

  • ファイル内の特定の文字列だけを書き出す

    中身が a a a b b b a … と書かれたファイルがあります。 このファイルの中の文字のうち、aのみを書き出したく、以下のプログラムを作成したのですが、上手く動きません。 何がおかしいか教えていただけないでしょうか。 ちなみにエラーは、 Segmentation fault (core dumped) と出ます。 #include <stdio.h> void main() { int x; float c[2160]; FILE *fp; fp = fopen("test.txt", "r"); if(fp == NULL) { printf("ファイルを開くことが出来ませんでした.¥n"); return; } x = 0; while (feof(fp)==0){ c[x] = getc(fr); if(strcmp(c[x], "a")==0) putchar(c[x]); x++; } fclose(fp); }

  • ファイルに文字列を書く

    ファイルを2つ読み込んでファイルを書き直そうとしたのですが 2度目に書き込もうとしたときに改行の書き込みがおかしくなってしまいます してほしいところで改行を一回だけしてほしいと思っているのですが 実際には多数改行されます どうしたら改行が一回だけになりますか? ---ソース--- #include <stdio.h> void main(void){ FILE *fp; char *tm[1000]; char buf[400]; int i=1,sei; fp= fopen("now.txt","w+"); fprintf(fp,"もも"); fclose(fp); //何で最初に書き込んでるんだ? //という突っ込みがあるでしょうが本当に作りたいプログラムは最初にファイルに書き込まないといけないためです。 fp= fopen("now.txt","r"); while( fgets( buf, 400, fp ) != NULL ){ tm[0]=(char*)malloc(strlen(buf)+1); strcpy(tm[0], buf); } fclose(fp); fp =fopen("moto.txt","r"); while( fgets( buf, 400, fp ) != NULL ){ if(i<999){ tm[i] = (char*)malloc(strlen(buf+1)); strcpy(tm[i], buf); i++; } else{ tm[999] = (char*)malloc(strlen(buf+1)); strcpy(tm[999], buf); } } fclose(fp); if(i<1000){ sei=i; } else{ sei=1000; } fp =fopen("chat_deta.txt","w+"); for(i=0;i<sei;i++){ fprintf(fp,"%s\n",tm[i]); } if(i!=(sei-1)){ fprintf(fp,"\n"); } for(i=0;i<sei;i++){ free(tm[i]); } fclose(fp); } } ---now.txt--- もも ---moto.txt--- オレンジ みかん

専門家に質問してみよう