電子部品の購入を大学生協で
http://www.itmedia.co.jp/news/articles/0601/17/news047.html
期待大!
#include <stdio.h> #include <stdlib.h> #include <string.h> #define NN 100 struct Textdata{ char textline[NN]; //一行文の文字数 struct Textdata* NextP; //次のデータ構造へのポインタ }; int main(void) { FILE *fp; char fname[10],exten[5]=".txt"; struct Textdata* TopP; //トップ位置 struct Textdata* LineP; //一行のはじめ struct Textdata* PrevP = NULL; //直前位置 /******ファイル名の入力*******/ printf("Input a File name : "); gets(fname); strcat(fname, exten); if((fp = fopen(fname,"r")) != NULL){ //既存のファイルが存在するとき while(-1){ LineP = malloc(sizeof(struct Textdata)); if (!LineP){ printf("Momory allocation error!"); exit(1); } fgets(LineP->textline,NN,fp); int len; len=strlen(LineP->textline); LineP->textline[len-1]='?0'; if(feof(fp)!=0){ free(LineP); break; } LineP->NextP = NULL; //一行入力した次のポインタをNULLに if (PrevP){ //はじめて入力したとき PrevP->NextP = LineP; //直前位置を示すPrevPに一行目のポインタを入れる }else TopP = LineP; //はじめての入力でないとき PrevP = LineP; //直前の位置を保存 } LineP = TopP; while(LineP){ printf("%s", LineP->textline); LineP = LineP->NextP; } fclose(fp); } /******文章入力*******/ printf("?nInput text! :?n"); while (-1){ //無限ループ LineP = malloc(sizeof(struct Textdata)); //一行文を確保 if (!LineP){ printf("Momory allocation error!"); exit(1); } gets (LineP->textline); if (!strcmp(LineP->textline, "SaveQ")){ //SaveQを入力すると一行文のメモリを解放 free(LineP); break; //whileの無限ループから抜ける } else if(!strcmp(LineP->textline, "SAVE")){ //保存して継続 //free(LineP); LineP = TopP; if((fp = fopen(fname,"w")) == NULL){ printf("%s.txt Open Error!",fname); free(fname); exit(1); } while(LineP){ fprintf(fp,"%s?n", LineP->textline); LineP = LineP->NextP; } fclose(fp); continue; } else if(!strcmp(LineP->textline, "SaveAs")){//新たなファイル名で保存 free(LineP); /******ファイル名の入力*******/ printf("Input a File new name : "); gets(fname); strcat(fname, exten); LineP = TopP; if((fp = fopen(fname,"w")) == NULL){ printf("%s.txt Open Error!",fname); free(fname); exit(1); } while(LineP){ fprintf(fp,"%s?n", LineP->textline); LineP = LineP->NextP; } fclose(fp); continue; } else if(!strcmp(LineP->textline, "IMPORT")){//既存のファイルを読み込み追加 free(LineP); FILE *fp2; char fname2[10]; do{ printf("Import File name : "); gets(fname2); if((fp2 = fopen(fname2,"r")) == NULL){ printf("'%s'を見付けられません?n",fname2); } }while(fp2 == NULL); while(-1){ LineP = malloc(sizeof(struct Textdata)); if (!LineP){ printf("Momory allocation error!"); exit(1); } fgets(LineP->textline,NN,fp2); int len; len=strlen(LineP->textline); LineP->textline[len-1]='?0'; if(feof(fp2)!=0){ LineP->NextP = NULL; free(LineP); break; } LineP->NextP = NULL; //一行入力した次のポインタをNULLに if (PrevP){ //はじめて入力したとき PrevP->NextP = LineP; //直前位置を示すPrevPに一行目のポインタを入れる }else TopP = LineP; //はじめての入力でないとき PrevP = LineP; //直前の位置を保存 } fclose(fp2); continue; } else if(!strcmp(LineP->textline, "QUIT")) exit(1); //強制終了 else if(!strcmp(LineP->textline, "SEARCH")){ //検索 char buff[20]; int Le,Ch=0,len,i,j,m=0; printf("Target: "); gets(buff); len = strlen(LineP->textline); //文字数カウント LineP->textline[len-1]='?0'; LineP = TopP; while(LineP){ Le=1; for(i=0,j=0; i<=len; i++){ printf("a%d?n",i); if(LineP->textline[i] == buff[j]){ //一文字目が見付かる Ch=i+1; //文字列番号を保存 printf("bbbbbbb?n"); for(;LineP->textline[i]==buff[j] || j>=strlen(buff);i++,j++){ //残りの文字を比較 printf("cccc%d?n",j); if(j==strlen(buff)-1){ //全てが同じだったら m++; printf("%d:L%d,C%d?n",m,Le,Ch); break; } } //残りの文字比較 if(j>strlen(buff)) printf("Not found11,i=%d,j=%d?n",i,j); }//1文字目が見付かる else if(len<i) printf("Not found22,i=%d,j=%d?n",i,j); }//一つの行について比較 Le++; LineP = LineP->NextP; //次の行にいく } } LineP->NextP = NULL; //一行入力した次のポインタをNULLに if (PrevP){ //はじめて入力したとき PrevP->NextP = LineP; //直前位置を示すPrevPに一行目のポインタを入れる }else TopP = LineP; //はじめての入力でないとき PrevP = LineP; //直前の位置を保存 } //while無限ループ終了 LineP = TopP; /********ファイルの保存***********/ if((fp = fopen(fname, "r")) != NULL){ //同一名のファイルがあったとき char slct[10]; while(-1){ printf("同じ名前のファイルが既にあります。上書きしますか? y/n :"); gets(slct); if(strcmp(slct,"y")==0 || strcmp(slct,"n")==0)break; } if(!strcmp(slct,"y")){ //上書き保存 if((fp = fopen(fname,"w")) == NULL){ printf("%s.txt Open Error!",fname); exit(1); } while(LineP){ fprintf(fp,"%s?n", LineP->textline); LineP = LineP->NextP; } fclose(fp); } else if(!strcmp(slct,"n")){ //上書き保存しない while(-1){ printf("追加書き込みしますか? y/n :"); gets(slct); if(strcmp(slct,"y")==0 || strcmp(slct,"n")==0)break; } if(!strcmp(slct,"y")){ if((fp = fopen(fname,"a")) == NULL){ //追加書き込み printf("%s.txt Open Error!",fname); exit(1); } while(LineP){ fprintf(fp,"%s?n", LineP->textline); LineP = LineP->NextP; } fclose(fp); } else if(!strcmp(slct,"n")){ //追加書き込みをしない while(-1){ printf("新しい名前で保存しますか? y/n :"); gets(slct); if(strcmp(slct,"y")==0 || strcmp(slct,"n")==0)break; } if(!strcmp(slct,"y")){ //新しい名前で保存 printf("Input a File new name : "); gets(fname); strcat(fname, exten); if((fp = fopen(fname,"w")) == NULL){ printf("%s.txt Open Error!",fname); free(fname); exit(1); } while(LineP){ fprintf(fp,"%s?n", LineP->textline); LineP = LineP->NextP; } fclose(fp); } else if(!strcmp(slct,"n")){ //上書き保存せず、追加書き込みをせず、新しい名前で保存しないとき printf("Not save."); } }//新しい名前 }//追加書き込み }//上書き else { //同一ファイル名がないとき、通常保存 if((fp = fopen(fname,"w")) == NULL){ printf("%s.txt Open Error!",fname); exit(1); } while(LineP){ fprintf(fp,"%s?n", LineP->textline); LineP = LineP->NextP; } fclose(fp); } /********メモリの解放*********/ LineP = TopP; while(LineP){ free(LineP); LineP = LineP->NextP; } return 0; }