• ベストアンサー

教えてください

こんにちは。質問させて下さい。 以前質問したのですが、うまくいかず悩んでいます。 -------------------------------------------------------- char line[512]; char *ptmp,*ptmp2; FILE *fpi,*fpo; fpi=fopen("moto.txt","r"); fpo=fopen("saki.txt","w"); while (getline(line, sizeof(line), fpi) == EXIT_OK) { ptmp=line; for(ptmp2=ptmp;*ptmp2;ptmp2++){ if(!strncmp(ptmp2, "$http://", 8)){ strncpy(ptmp2, "http://", 7); } } fputs(line,fpo); fputs("\n",fpo); } -------------------------------------------------------- moto.txtを読込み、saki.txtに書き込む処理です。 読込んだ行に"$http://"が存在した場合は、"$http://"に変更する処理を 作成しているですが、うまくいきません。 読込んだ行--------------------------- aaaa$http://aaaa.co.jp/bbbbb$cccc$ 本当は以下の様にしたい--------------- aaaahttp://aaaa.co.jp/bbbbb$cccc$ 結果はこうなってしまう--------------- aaaahttp:///aaaa.co.jp/bbbbb$cccc$ 恐らく"strncpy(ptmp2, "http://", 7)の部分がいけないとおもうのですが・・・ アドバイス宜しくお願い致します。

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

  • ベストアンサー
回答No.5

> aaaahttp://aaaa.co.jp/bbbbb$cccc$$ > と文末に"$"が表示されてしまいます。 末端の'\0'がズレていません。 ズラしの回数が一回足りません。

toopeaan
質問者

お礼

すみません、できました。 ご迷惑お掛けしました!!

toopeaan
質問者

補足

再びの回答有難うございます。 >末端の'\0'がズレていません。 >ズラしの回数が一回足りません 末尾以外は正常なのですが、 i=7とj=8の時点でずれていると思うのですが、どうしてでしょうか? 例) $|h|t|t|p|:|/|/|w|w|w|.|a|a|a|.|c|o|.|j|p|/|\0| h|t|t|p|:|/|/|w|w|w|.|a|a|a|.|c|o|.|j|p|/|\0| すみません、自分なりに考えているのですが、 答えがうまく導きだせません。 アドバイスお願い致します。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • hogeta
  • ベストアンサー率14% (4/28)
回答No.4

No.2の者ですが、ずらしている「だけ」だからです。 さっきの回答をちょっと使い回せばすぐ解決するはずです。

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

>> 一つづつ前にずらす処理が抜けています。 > 上記は以下のような記述でいいのでしょうか? そんなのは訊くことではありません。 やってみることです。

全文を見る
すると、全ての回答が全文表示されます。
  • hogeta
  • ベストアンサー率14% (4/28)
回答No.2

$|h|t|t|p|:|/|/| ← 8バイト ↓ h|t|t|p|:|/|/| ← 7バイト だから、8バイト目の/が残ってしまってます。 単純な方法でも良ければ、strcpyで書き換えた 後に、 int i,j; for(i=7,j=8;*(ptmp2+j)!='\0';i++,j++) *(ptmp2+i)=*(ptmp2+j); とでもすればいいのでは

toopeaan
質問者

補足

早速の回答ありがとうございます。 上記の記述で確かめてみたところ aaaahttp://aaaa.co.jp/bbbbb$cccc$$ と文末に"$"が表示されてしまいます。 i=7, j=8とずらしているのですがどうしてでしょうか? 宜しくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

"http://"の後ろに続く部分("aaa.co.jp....")を 一つづつ前にずらす処理が抜けています。

toopeaan
質問者

補足

返信ありがとうございます。 >一つづつ前にずらす処理が抜けています。 上記は以下のような記述でいいのでしょうか? -------------------------- /*ポインタを1つずらして格納*/ *ptmp2 = *(ptmp2 + 1); ---------------------------

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 指定の行をループさせてファイルに出力

    C言語で"input.txt"内の文の行範囲と 繰り返す回数をキーボードから入力することにより 結果を"output.txt"に出力するプログラムを考えているのですが、うまくできません。 具体例を以下に示しておきます。 ----input.txt---- aaaa bbbb cccc dddd eeee ------------------ キーボードから繰り返す範囲、2行目と4行目を指定。 繰り返す回数を2回に指定。 ----output.txt---- aaaa bbbb cccc dddd bbbb cccc dddd eeee ------------------- と、こんな感じにしたいです。 指定した行範囲を"output.txt"に出力することはできたのですが 繰り返しの部分がうまくできません。 どなたかご教授お願いします。 自分が作ったプログラムを下に載せておきます。 これをベースに作れたらいいのですが・・・ #include<stdio.h> #include<stdlib.h> #define STR_MAX 256 int main (void) { FILE *fpin, *fpout; char buff[STR_MAX]; int line = 1; int start; int end; printf("start >>"); scanf("%d",&start); printf("end >>"); scanf("%d",&end); if((fpin = fopen("input.txt","r")) == NULL) { printf("infile can't open\n"); exit(EXIT_FAILURE); } if((fpout = fopen("output.txt","w")) == NULL) { printf("outfile can't open\n"); exit(EXIT_FAILURE); } while(fgets(buff,STR_MAX,fpin) != NULL) { if((line >= start)&&(line <= end)) { fputs(buff,fpout); } line = line + 1; } fclose(fpout); fclose(fpin); return EXIT_SUCCESS; }

  • バイナリデータ作成したいのですが、fwriteの使用方法を教えてください。

    indataというhexで書かれたテキストファイルをバイナリデータに変換したく 以下のようなプログラムを作成しましたが、dataのサイズを大きくすると coreダンプしてしまいます。具体的には7M超くらいから。 入力ファイルサイズはほぼ無限にあり、出力バイナリファイルは20MByteは欲しいです。 どのように改造したら、大きなサイズのバイナリファイルが作成できるでしょうか? 初心者ながら、いろいろ調べてここまで作成したので、根本がおかしいかもしれません。 よろしくお願いいたします。 #include<stdio.h> int main(void) { FILE *FPi, *FPo; char data[5000000]; int getdt,x; FPi=fopen("indata","r"); if ( FPi == NULL ) {return 1;} FPo = fopen("res.bin","wb"); if ( FPo == NULL ) {return 1;} x=0; while (1) { if(fscanf(FPi,"%x" , &getdt) == EOF ) {break; } data[x]=getdt; x++; } fwrite(data, sizeof(data), 1, FPo); fclose(FPo); fclose(FPi); return 0; }

  • ファイル操作

    コマンドライン引数から、データを入力し、入力データ中の数字を'*'文字で置き換え、それ以外の文字をそのまま出力させるプログラムを作るため #include<stdio.h> int main(int argc, char *argv[]){ FILE *fpi,fpo; char ch; if(argc!=3) { fprintf(stderr, "Illegal number of argument.\n"); return(-1); } if((fpi=fopen(argv[1],"r"))==NULL) { fprintf(stderr, "Can't open input file <%s>.\n", argv[1]); return(-1); } if((fpo=fopen(argv[2],"w"))==NULL){ fprintf(stderr, "Can't open output file <%s>.\n", argv[2]); return(-1); } while((ch=fgetc(fpi))!=EOF){ if(ch>=0 && ch<=9){ ch='*'; } } fclose(fpi); fclose(fpo); return 0; } のようなプログラムを書いたのですが、 if((fpo=fopen(argv[2],"w"))==NULL)がimcompitable types in assigment fclose(fpo);がimcompitable types for arguments1 of 'fclose' というようなエラーが出ます。 なぜか教えていただけませんか? また、その他、足りないところがあれば教えていただけませんか?

  • C言語の質問です

    #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *fpi, *fpo; unsigned char idat; /* 引数のチェック */ if (argc != 3) { fprintf(stderr, "Usage: %s [input] [output]\n", argv[0]); exit(1); } /* 入力画像のオープン */ if((fpi=fopen(argv[1], "rb")) == NULL){ fprintf(stderr, "input file open error\n"); exit(1); } /* 出力画像のオープン */ if((fpo=fopen(argv[2], "wb")) == NULL){ fprintf(stderr, "output file open error\n"); exit(1); } /* 入力画像の読込み */ while (fread(&idat, sizeof(unsigned char), 1, fpi) == 1){ /* 2倍の変換 */ if (idat * 2 > 255) { idat = 255; } else { idat = idat * 2; } /* 変換データの書出し */ if(fwrite(&idat, sizeof(unsigned char), 1, fpo) != 1){ fprintf(stderr, "data write error\n"); exit(1); } } fclose(fpi); fclose(fpo); return (0); } このプログラムをグレースケール化のプログラムに修正してください お願いします

  • Perl言語でファイル入出力プログラムについて

    Perlでファイル入出力のプログラムをコーディングしたいのですが、いまいちハッシュが理解しずらく困っています。わかる方よろしくお願いします。 moto.pl の中にあらかじめ AAA aaa AaAa AAaa BBB bbb BbBb BBbb CCC ccc CcCc CCcc AAA aaa AaAa AAaa .... というように一行ずつ文字列があり、この場合では最初の大文字AAAが二つあるので、その結果を例えばsaki.plに AAA 2 ... というように出力するプログラムを教えて頂けませんか?

    • ベストアンサー
    • Perl
  • 加算できない

    #define NUM 1 void main(int argc, char *argv[]) { int i; float su01[NUM],suetc[NUM],j; FILE *fpi,*fpl; fpi = fopen(argv[1],"r"); fpl = fopen(argv[2],"r"); for(i=0;i<NUM;i++){ fscanf(fpi,"%f",&su01[i]); } for(i=0;i<NUM;i++){ fscanf(fpo,"%f",&suetc[i]); } for(i=0;i<NUM;i++){ suetc[i] += su01[i]; } for(i=0;i<NUM;i++) printf("%f\n",suetc[i]); } このプログラムで「aaa.txt」に入った30と「bbb.txt」に入った20を足して、50が入った「ccc.txt」というファイルを作りたいのですが、足し算をすることが出来ません。 よろしければご指摘をお願いします。

  • PHP 読み込んだファイルのブラウザ表示につい

    読み込んだTXTファイルの内容をブラウザに表示したいと思っています。 TXTファイルには aaaa bbbb cccc が入っています。 読み込んだデータを <?php $data = fopen("test.txt","r"); fpassthru($data); ?> でブラウザに表示しようとすると {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf350 {\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;} \paperw11900  ~ 省略 ~  \cf0 aaaa\ bbbb\ cccc} と最後にTXTの中身がありますが、余計なものも一緒に表示されてしまいます。 aaaa bbbb cccc と表示させるにはどうすればよいでしょうか?

    • ベストアンサー
    • PHP
  • pgm画像入出力(C言語)

    画像入出力のプログラムを書いた(とあるサイトからパクった)のですが、出力画像のテキストデータが文字化けしてしまいます。原因究明お願いします。このプログラムでは2倍に変換していますが、そこは重要ではなく、入出力さえできればいいです。 OS:windows 文字コード:色々試したけどダメ。試してないものもあるかも。 プログラム #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *fpi, *fpo; unsigned char idat; /* 引数のチェック */ if (argc != 3) { fprintf(stderr, "Usage: %s [input] [output]\n", argv[0]); exit(1); } /* 入力画像のオープン */ if((fpi=fopen(argv[1], "rb")) == NULL){ fprintf(stderr, "input file open error\n"); exit(1); } /* 出力画像のオープン */ if((fpo=fopen(argv[2], "wb")) == NULL){ fprintf(stderr, "output file open error\n"); exit(1); } /* 入力画像の読込み */ while (fread(&idat, sizeof(unsigned char), 1, fpi) == 1){ /* 2倍の変換 */ if (idat * 2 > 255) { idat = 255; } else { idat = idat * 2; } /* 変換データの書出し */ if(fwrite(&idat, sizeof(unsigned char), 1, fpo) != 1){ fprintf(stderr, "data write error\n"); exit(1); } } fclose(fpi); fclose(fpo); return (0); } コンパイル方法(cygwin) ./a 入力画像.pgm 出力画像.pgm

  • 文章中から特定の文字列を抜き出すプログラムについて C言語

    log.txtの文章からIPを抜き出しip.txtに書き込むというものです。log.txtの文章は基本的にfrom IP:port の順です。しかし文章中にfromがないとip.txtで空欄になってしまいます。 例192.168.1.100  192.168.1.110 理想はfromがない行はなにも追加せず次に移りたいのですがどうすればいいでしょうか? 例192.168.1.120 192.168.1.130 192.168.1.140 void addLine(const char*,FILE*); char *getFromIP(const char*,char*); int main() { FILE *pFileA = fopen("log.txt","rt"); char buff[256]; if(pFileA){ FILE *pFileB = fopen("ip.txt","wt"); if(pFileB){ for(;fgets(buff,256,pFileA) != NULL;){ char buff2[32] = {'\0'}; addLine(getFromIP(buff,buff2),pFileB); } fclose(pFileB); } fclose(pFileA); } return 0; } char *getFromIP(const char *line, char *buff) {  char *src, *dst;        src = strstr(line, "from");  if(src==NULL) { return buff; }   src += 4;            dst = buff;          while(1) {   if(isspace(*src))  {    src++;    continue;          }   else break;         }                    while(1) {   *dst = *src;          if(*dst == ':')        {    *dst = '\0';          break;           }   if(*dst == '\0')       {   break;           }  dst++;            src++;           }  return buff;         } void addLine(const char *str,FILE *pFile){ char buff[1024]; sprintf(buff,"%s\n",str); fputs(buff,pFile); }

  • 続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--- オレンジ みかん