• ベストアンサー

もし良ければ見て下さい

 例えば、「in」を入力すれば、食わせたファイル内の「in」を含む行を全て出力するプログラムを作りました。  しかし、  (1)このファイル自身を食わせて「*」を入れると関係ない行まで出力される。  (2)このファイル自身を食わせて「re」を打つと空白の行しか出力されない    (どうして「return(0); 」が出力されない?) のです。  もし良ければこのプログラムを見て、ご指摘ください。 #include<stdio.h> int main(int argc,char **argv) { FILE *file1; int i,nagasa; char line[256],*p,*q,*r; file1=fopen(argv[1],"r"); for(p=argv[2],nagasa=0;*p;++p,++nagasa); while(fgets(line,256,file1)!=NULL) { for(p=line,i=0;*p!='\0';++p) { for(q=argv[2];*q;++q) { while(*p!=*q && *p!='\0')++p; if(*p!='\0' && *q!='\0') { for (i=0;*q==*p;++p,++q,++i); } } } if(i==nagasa) for(p=line;*p!='\0';++p) printf("%c",*p); } return(0); }

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>アドバイスありがとうございます。 >「argv[1]」というファイルを1行ずつ読み込んで行く際、、読み込む停止条件を「*p='\n'」とする必要はありますか?(そこが一番分からないんです・・・・・) 改行文字を意識する必要はありません。単に普通の一致しない文字とみなせばいいだけなので。 逆に、最終行に改行が入っていないファイルを読み込んだときの動作がおかしくなりそうです。 がんばっているみたいなのでヒントのヒントを >iを初期化する場所と、 if(i==nagasa) のところで、iが初期化されないうちに判断が行われたり、1行前の結果が iに入っている状態で判断が行われる可能性があります。 >for(q=argv[2];*q;++q) >のループの必要の有無を考えてみましょう。 行の内容を"abcdef"、argv[2]を"cde"とします。 cdeが行の中で検索されたあとに、deとeを検索する必要はないですよね。 あとは、ここですかね。 while(*p!=*q && *p!='\0')++p; ここで++pが行われる条件は、 行の内容が"aaabcd"、argv[2]が"ab"というときですよね。 それではまずいので、qもインクリメントする必要がありそうです。 最後にもうひとつ。 argv[2]が"ab"のとき、"acab"がちゃんと出力されるようにしてあげてくださいね。

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

その他の回答 (3)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

失礼しました。 >>iを初期化する場所と、 >if(i==nagasa) >のところで、iが初期化されないうちに判断が行われたり、1行前の結果が >iに入っている状態で判断が行われる可能性があります。 for(p=line,i=0;*p!='\0';++p) ここの行でiの初期化はいっていましたね。見落としてました。 なお、このforループの終了条件ですが、あってますよ。

chikako-imagawa
質問者

補足

いろいろありがとうございました。できました。 「 #include<stdio.h> int main(int argc,char **argv) { FILE *file1; int i=0,nagasa,kenchi=0,x=0; char line[256],*p,*q,*r; file1=fopen(argv[1],"r"); for(p=argv[2],nagasa=0;*p;++p,++nagasa);--nagasa; while(fgets(line,256,file1)!=NULL) {++x; for(p=line,i=0;*p!='\0';) { for(q=argv[2];*q;++q) { while(*p!=*q && *p!='\0')++p; for(i=0;*q==*p && *p!='\0' && *q!='\0';++p,++q,++i)if(i==nagasa)kenchi=1; } } if(kenchi==1) for(p=line;*p!='\0';++p) { printf("%c",*p); kenchi=0; } } return(0); } 」 てな感じです。 「+」と「[ - ]」と「.」が使えるようにもう少しがんばります!

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

こんにちは.Esnaです. 見た感じでは,for文の条件がいけないのでは,ないでしょうか. 例えば, for(p=line,i=0;*p!='\0';++p) ですが,for文の処理は,確か for(1;2;3){   4; } のときに, 1->2->4->3->2->4->… と動くはずですが,chikako-imagawaさんのプログラムでは,pが記号列終端を指した後に,for文の3が行われて,pが訳のわからないとこをさしているので,2の条件式が働いていないように思います. for(q=argv[2];*q;++q) も同じようなことになってます. バグがあるかも知れませんが,見た感じとしては, } } if(*p == '\0') break; } if(i == nagasa… の2行を入れてみたらいいんじゃないかと思います.

chikako-imagawa
質問者

お礼

 アドバイスありがとうございます。  じつは大学のC-padは「break」が効かないんです・・・・  その場合はどうしたらいいでしょう?

全文を見る
すると、全ての回答が全文表示されます。
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

まずは、自分でデバッグをしてみましょう(^^;; いろいろと問題ありそうですし。 一応ヒントを。 iを初期化する場所と、 for(q=argv[2];*q;++q) のループの必要の有無を考えてみましょう。

chikako-imagawa
質問者

お礼

 アドバイスありがとうございます。  「argv[1]」というファイルを1行ずつ読み込んで行く際、、読み込む停止条件を「*p='\n'」とする必要はありますか?(そこが一番分からないんです・・・・・)  今日学校でもう一度考えてみます。  ありがとうございます。 

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

関連するQ&A

  • 配列

    #include "stdafx.h" #include <ctype.h> #include <string.h> #include <stdlib.h> typedef struct { char number[6]; char class_type[20]; char name[8]; char subject[5]; } my; my data[100]; int main(int argc, char* argv[]) { FILE *fp; int field = 0, line = 0; char buf[1000], *str; char bufG[1111]; int i; if((fp=fopen("test3.csv","r"))==NULL){ printf("ファイルが開けません"); } while(fgets(buf,1000,fp) !=NULL){ str=buf; while(*str != '\0'){ if(*str != ','){ for(i = 0; *str != ',' && *str != '\0' ; i++){ if(*str == '\n'){ } else{ bufG[i] = *str; } str++; } bufG[i] = '\0'; switch(field){ case 0: strcpy(data[line].number, bufG); break; case 1: strcpy(data[line].class_type, bufG); break; case 2: strcpy(data[line].name, bufG); break; case 3: strcpy(data[line].subject, bufG); break; } field++; } else{ str++; } } line++; field = 0; } int p, q; for(p = 0; p < line; p++){ for(q = 0; q < line; q++){ if(strcmp(data[p].class_type, data[q].class_type) == 0 && strcmp(data[p].subject, data[q].subject) == 0 && p != q ){ printf("p=%d q=%d\n", p, q); } } } fclose(fp); return 0; } こちらのプログラムは 1,A,山根,音楽//番号、クラス、名前、好きな教科 2,B,本田,美術 3,B,松本,美術 4,A,横野,音楽 というファイルの内容を読み込んでクラスと好きな教科が同じものを 1,A,山根、音楽 4,A,横野、音楽 2,B,本田、美術 3,B,松本、美術のようにソートするプログラムの途中で 一致する行を表示しようとしている所です。 これをコンパイルした場合 一致しているのは 0行目と3行目 1行目と2行目 2行目と1行目 3行目と0行目と表示され実際には同じ行が含まれています。 このような場合どのように改善すればいいのか教えて下さい。

  • テキストファイルの変換なのですが

    課題でドラックアンドドロップされたファイルの文書の全角カタカナを半角カタカナに変換するというソフトが思うとおりに動きません。 ご協力をお願いします。 ファイルの文字コードはS-jisです。 ドラックアンドドロップをしてテキストファイルを読み込むところまではうまくいきました。 テキストファイルを1バイトずつ読み込んで、全角カタカナの領域である「0x83」の判定を読み込むことはできるのですが、それ以降がうまくいきません。 テキストファイルの文字列に関するアドレスに関する知識不足だとは思うのですが、考えても分かりません。 以下に、コードを載せさせていただきますので解決だけでなく改良もあれば教えてください。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <mbstring.h> #define BYTE unsigned char char *getStrTailPoint(char *); char *getDotPoint(char *,char *); char* changeCode(int); void StringCat2(char *, char *); void main(int argc,char** argv ) { //tail…パス+ファイル名のENDポイントアドレス //dot…拡張子のポイントアドレス char *tail ; char *dot; //bfp…BaseFilePointAddress //mfp…MakedFilePointAddress FILE *bfp,*mfp; //makedFileName…作られるファイルの名前 char makedFileName[1000]; static int i; //ファイルからの文字を格納する一時格納する変数 char *r,tmp[3]; int p; BYTE q; if(argv[1]!=NULL){ // argv[1]…ドラックアンドドロップされたファイルとパスが格納 //ファイルを開く if(NULL ==(bfp=fopen(argv[1],"r"))) { printf("指定されたファイルを開けません"); getchar(); exit(1); } tail = getStrTailPoint(argv[1]); dot = getDotPoint(argv[1],tail); //makeFileNameに"."までの元の名前を格納 for(i = 0;&argv[1][i]<=dot;i++){ if(&argv[1][i]<dot){ makedFileName[i]=argv[1][i]; }else{ makedFileName[i]='\0'; } } //makeFileNameに"__"と拡張子を挿入 strcat(makedFileName,"__"); strcat(makedFileName,dot); //新規ファイルの作成 if(NULL ==(mfp=fopen(makedFileName,"w"))){ printf("新規ファイルを作れません"); getchar(); exit(1); } //既存ファイルから新規ファイルにテキストをコピー //新規ファイルの全角文字を半角文字へ while((p = fgetc(bfp)) != EOF) { q=(BYTE)p; if(0x83==q){ /*r=changeCode(p); fputs(r,mfp); break;*/ fputc('2',mfp); continue; } fputc(p,mfp); } //ファイルを閉じる fclose(bfp); fclose(mfp); } return ; } /* *getStrTailPoint   *文字列のENDポイントアドレスを調べる関数 */ char *getStrTailPoint(char *string){ char *p; int i ; int len = strlen(string); for(i=0;i<=len+1;i++){ if(*string=='\0'){ p=string; return p; } string++; } return string; } /* *getDotPoint *ファイルの拡張子の名前が始まるポイントアドレスを検出する関数 */ char *getDotPoint(char *string,char *tail){ char *p; int i; int len = strlen(string); for(i=0;i<len;i++){ if(*tail=='.'){ p=tail; return p; } tail--; } return tail; } char* changeCode(int ch){ char p[3]; char *zenkaku ={"アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポ\0"}; char *hankaku ={"アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョ\0"}; char *hankaku2 ={"カキクケコサシスセソタチツテト"}; char *hankaku3 ={"ハヒフヘホ"}; char *dakutenn ={"゛゜"}; do{ if(*zenkaku<='ョ'||ch==*zenkaku){ p[0]=*hankaku; p[1]='\0'; return p; break; }else if(ch==*zenkaku){ if(*zenkaku<='ド'){

  • メモリ

    #include "stdafx.h" #include <ctype.h> #include <string.h> #include <stdlib.h> int check(int a[100], int n); typedef struct { char number[6]; char class_type[20]; char name[8]; char subject[5]; } my; my data[100]; int main(int argc, char* argv[]) { FILE *fp; int field = 0, line = 0; char buf[1000], *str; char bufG[1111]; int i; if((fp=fopen("test3.csv","r"))==NULL){ printf("ファイルが開けません"); } while(fgets(buf,1000,fp) !=NULL){ str=buf; while(*str != '\0'){ if(*str != ','){ for(i = 0; *str != ',' && *str != '\0' ; i++){ if(*str == '\n'){ } else{ bufG[i] = *str; } str++; } bufG[i] = '\0'; switch(field){ case 0: strcpy(data[line].number, bufG); break; case 1: strcpy(data[line].class_type, bufG); break; case 2: strcpy(data[line].name, bufG); break; case 3: strcpy(data[line].subject, bufG); break; } field++; } else{ str++; } } line++; field = 0; } int p, q; int a[100]; int u = 0; for(p = 0; p < line; p++){ for(q = 0; q < line; q++){ if(strcmp(data[p].class_type, data[q].class_type) == 0 && strcmp(data[p].subject, data[q].subject) == 0 && p != q ){ //処理 } } } } fclose(fp); return 0; } 先日文字列入れ替えについてご質問したものですが メモリの取り方についてご質問します。 先日このプログラムにおいて my data[100]と固定してるのはいけないという意見をもらったので メモリを取得しようと思ってるのですが できればdata[i].○○の形でアクセスしたいのでこのままの形は あまりかえたくないです。この場合 while(fgets(buf,1000,fp) !=NULL){ str=buf;     int len = strlen(buf); my *o; o = (my *)calloc( len + 1, sizeof(my *)) while(*str != '\0'){ としてみたのですがこれは実際どうなのでしょうか? NULLは帰ってきてないみたいなので割り当ては出来てるとは思うんですが この一行の文字列の大きさにぴったり合うメモリを割り当てたいのですが ちゃんとなっているか調べる方法を教えて下さい。

  • ファイルの内容の表示

    実行時のコマンドライン引数で指定したファイルの内容を、行番号付きで画面に表示するプログラムを作る という問題です。ヒントも与えられています。 行番号付きの表示、コマンドライン引数の利用。両者を組み合わせればできるはずだ >  main関数の引数にargcとargvを指定して、コマンドライン引数をファイル名として利用する。キーボード入力を促す文(プロンプト)や改行チェックは不要なので書かないこと >  コマンドライン引数が指定されない場合は、メッセージを表示してプログラムを終了 >  ファイルの内容を画面表示する処理は、ユーザー定義関数put_file_contentsに記述する。仮引数には文字型のポインタ変数をひとつ指定し、ファイル名を受け渡せるようにする。put_file_contents自体の型は整数型(int)で、正常終了なら返り値0を返すこと。 行番号付きのプログラム#include<stdio.h> > int put_file(char *filename); > > int main() > { > char line[50]; > char *ptr; > > printf("ファイル名を入力:"); > fgets(line,sizeof(line),stdin); > ptr = line + strlen(line) - 1; > if(*ptr == '\n') { > *ptr = '\0'; > } > > put_file(line); > > return 0; > } > > int put_file(char *filename) > { > FILE *fp; > char buf[100]; > int line_no; > > fp = fopen(filename,"r"); > if (fp == NULL){ > printf("%sを開けません\n",filename); > return 1; > } > line_no = 1; > while (fgets(buf,sizeof(buf),fp) != NULL){ > printf("%3d: ",line_no); > printf("%s",buf); > line_no++; > } > fclose(fp); > > return 0; > } で、コマンドライン引数のプログラムは#include<stdio.h> void write_key_inputs(char *filiname); int main(int argc, char *argv[1]) { write_key_inputs(argv[1]); return 0; } void write_key_inputs(char *filename) { FILE *fp; char buf[100] ; fp = fopen(filename,"w"); while(fgets(buf, sizeof(buf),stdin) != NULL) { fputs(buf, fp); } fclose(fp); return ; } です。これらを組み合わせて少しいじると出来るみたいなのですが、できていません。ちなみに私が考えたプログラムは #include<stdio.h> int put_file_contents(char *filename); int main(int argc,char *argv[]) { int i; if(argc == 1){ printf("コマンドライン引数がありません\n"); return 1; } for(i = 0;i<argc;i++) printf("argv[%d]は「%s」です\n",i,argv[i]); put_file(i); return 0; } int put_file(char *filename) { FILE *fp; char buf[100]; int line_no; fp = fopen(filename,"r"); line_no = 1; while (fgets(buf,sizeof(buf),fp) != NULL){ printf("%3d: ",line_no); printf("%s",buf); line_no++; } fclose(fp); return 0; } です。コマンドライン引数は表示されるのですが、行番号が表示されません。どうしたらいいでしょうか??

  • 配列の配列?

    80字より長い行を全て印字するというプログラムを作ろうと思います。 それで今現在下記の状態なんですが #include <stdio.h> #define MAXLINE 1000 int getline(char line[], int maxline); void copy(char s1[], char s2[]); int main(int argc, char* argv[]) { int len; int max; char line[MAXLINE]; char longest[MAXLINE]; max = 0; while((len = getline(line, MAXLINE))> 0){ if(len > 80){ max = len; copy(longest, line); } } if(max > 0){ printf("%s", longest); } return 0; } int getline(char s[], int lim) { int c, i; for(i = 0; i < lim -1 && (c = getchar()) != EOF && c != '\n'; ++i){ s[i] = c; } if(c == '\n'){ s[i] = c; ++i; } s[i] = '\0'; return i; } void copy(char s1[], char s2[]) { int i; i=0; while((s1[i] = s2[i]) != '\0'){ ++i; } } この状態だと80字以上の行を1行しか表示しません。 おそらくは配列の配列を使って保存しておくのだとは考えたのですが 使い方がわかりません。教えて下さい。

  • 一部コマンドでエラー

    以下のプログラムにパス検索機能を追加しろ。 /bin/lsと入力していたものを、lsだけで実行できるようにする。 そのほかにもdata -Iやgcc -o test test.c、./testを実行可能にする。 と言う課題で、 if(execv(argv[0],argv[])==(-1)){をif(execvp(argv[0],argv)==(-1)){とする方法を聞いたのですが、 gcc -o test test.cを入力すると長文のエラーが出力されます。 どうしたら良いでしょうか? #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> main(int argc, char *argv[]){ int len, pid, st; char *p; int i, sp_flag; static char prompt[64]="> "; char command[256]; printf("%s",prompt); while (fgets(command, 256, stdin) != NULL){ if((len = strlen(command)) == 1)break; command[len-1] = '\0'; p=(char *)&command; sp_flag=0; for(i=0; *p!='\0';p++){ if(sp_flag == 0 && *p!=' '){ argv[i]=p; sp_flag=1; i++; }else if(*p==' '){ *p='\0'; sp_flag=0; } } argv[i]=(char *)0; for(i=0; argv[i]!=(char *)0; i++){ printf("%s\n",argv[i]); } if((pid = fork()) == 0){ if(execv(argv[0],argv)==(-1)){ printf("%s", "exec error.\n"); exit(1);} } else if(pid >= 1){ wait(&st); printf("%s", prompt); } else { perror("fork"); exit(1); } } exit(0); }

  • 文字入れ替え

    #include "stdafx.h" #include <ctype.h> #include <string.h> #include <stdlib.h> typedef struct { char number[6]; char class_type[20]; char name[8]; char subject[5]; } my; my data[100]; int main(int argc, char* argv[]) { FILE *fp; int field = 0, line = 0; char buf[1000], *str; char bufG[1111]; int i; if((fp=fopen("test3.csv","r"))==NULL){ printf("ファイルが開けません"); } while(fgets(buf,1000,fp) !=NULL){ str=buf; while(*str != '\0'){ if(*str != ','){ for(i = 0; *str != ',' && *str != '\0' ; i++){ if(*str == '\n'){ } else{ bufG[i] = *str; } str++; } bufG[i] = '\0'; switch(field){ case 0: strcpy(data[line].number, bufG); break; case 1: strcpy(data[line].class_type, bufG); break; case 2: strcpy(data[line].name, bufG); break; case 3: strcpy(data[line].subject, bufG); break; } field++; } else{ str++; } } line++; field = 0; } int p, q; for(p = 0; p < line; p++){ for(q = 0; q < line; q++){ if(strcmp(data[p].class_type, data[q].class_type) == 0 && strcmp(data[p].subject, data[q].subject) == 0 && p != q ){ printf("p=%d q=%d\n", p, q); } } } fclose(fp); return 0; } こちらのプログラムは 1,A,山根,音楽//番号、クラス、名前、好きな教科 2,B,本田,美術 3,B,松本,美術 4,A,横野,音楽 というファイルの内容を読み込んでクラスと好きな教科が同じものを 1,A,山根、音楽 4,A,横野、音楽 2,B,本田、美術 3,B,松本、美術のようにソートするプログラムの続きですが ソート方法についてです。 if(strcmp(data[p].class_type, data[q].class_type) == 0 && strcmp(data[p].subject, data[q].subject) == 0 && p != q ){ swap(data[p+1].number, data[q].number; swap(data[p+1].class_type, data[q].class.type); swap(data[p+1].name,data[q].name); swap(data[p+1].subject,data[q].subject); } void swap(char *p, char *q) { char *temp; temp = p; p = q; q= temp; } のように追加してみましたが入れ替えができていません。 どこがまずいのでしょうか?又他にも良い方法があれば教えて下さい。

  • 二行目の*の意味を教えてください。

    #include <stdio.h> int main(int argc, char *argv[]) { int i; for ( i = 0; i < argc; i++ ){ printf("argv[%d]=%s\n", i, argv[i]); } return argc; }  以上プログラムで、二行目の*の意味を教えてくさい。  6行目のargvには*が付いていません!?  よろしくお願いします。

  • cygwinを使ってcsvファイルを読み込み、出力させようとしています

    cygwinを使ってcsvファイルを読み込み、出力させようとしています。 とりあえず、読み込みのみのプログラムを作成し、 実行させてみたのですが(run ファイル名.csv と入力) 「Error: could not start C:\cygwin\home\ユーザー名ファイル名.csv」 と出力され、読み込みができず、困っています。 プログラム初心者です。 恐縮ですがご回答よろしくお願いします。 以下に、読み込みプログラムとcsvファイルを記載します。 (プログラムは拾い物です。) <プログラム> #include <stdio.h> #define MAX_ITEM_SIZE 100 #define MAX_LINE_SIZE 1024 char *GetCSVItem(char *wp, char *buff, int size); void main(int argc, char *argv[]) { FILE *fp; char buff[MAX_LINE_SIZE], *wp, item[3][MAX_ITEM_SIZE]; int i1, len; if(argc != 2){ printf("comand error nyuuryoku keishiki\n"); return; } fp = fopen(argv[1], "r"); if(fp == NULL){ printf("can not open file[%s].\n", argv[1]); return; } for(;;){ if(fgets(buff, MAX_LINE_SIZE, fp) == NULL) break; len = strlen(buff); if(len == 0 || buff[len-1] != '\n'){ if(feof(fp) == 0){ printf("data error[%s].\n", buff); return; } } buff[len-1] = '\0'; wp = buff; if((wp = GetCSVItem(wp, item[0], MAX_ITEM_SIZE)) == NULL){ printf("error(1)\n"); break; } if((wp = GetCSVItem(wp, item[1], MAX_ITEM_SIZE)) == NULL){ printf("error(2)\n"); break; } if((wp = GetCSVItem(wp, item[2], MAX_ITEM_SIZE)) == NULL){ printf("error(3)\n"); break; } if(*wp != '\0'){ printf("error(4)\n"); break; } for(i1 = 0; i1 < 3; i1++){ printf("%d:%s\n", i1+1, item[i1]); } } fclose(fp); } char *GetCSVItem(char *wp, char *buff, int size) { int i1; buff[0] = '\0'; while(*wp == ' ' || *wp == '\t') wp++; if(*wp == '\0'){ return(NULL); } for(i1 = 0; i1 < MAX_ITEM_SIZE; i1++, wp++){ if(i1 >= size) return(NULL); buff[i1] = *wp; if(*wp == '\0'){ buff[i1] = '\0'; return(wp); } if(*wp == ','){ wp++; buff[i1] = '\0'; break; } } return(wp); } <csvファイル> 1,2,3 11,12,13 21,22,23

  • [C++]ファイル出力について

    教えてください。 コマンドプロンプトから何行か書いた文章をファイルにしたいのですが、 うまくいきません。 作ったものの結果は1行1文字で出力されて、eofでうまく 終わってくれません。 コマンドプロンプトで入力(改行)された通りにファイルに出力 できるようにしたいので、どこがおかしいのか指摘お願いします。 #include <iostream> #include <fstream> #include <stdlib.h> #include <string.h> #include <string> using namespace std; int main(int argc, char *argv[]) { char str[100]; int i; i = 0; if (argc <= 1) { cerr << "Need filename" << endl; exit (1); } ifstream ifs(argv[1], ios::in); if (ifs) { cerr << "Caution" << argv[1] << " already exists " << endl; cerr << " Specify a different filename " << endl; exit (2); } ofstream ofs(argv[1], ios::out); if (!ofs) { cerr << " Unable to write to " << argv[1] << endl; exit (3); } while(str[i] !=EOF) { cin >> str[i]; ofs << str[i] << endl; i++; } return 0; }