ファイルから入力した文字数をカウントして出力するプログラムに関する質問

このQ&Aのポイント
  • 質問者はVC++のC言語を使ってファイルから入力した文字数をカウントして出力するプログラムをビルドしたが、警告が発生している。
  • 質問者が気になっているのは、警告が発生している理由と、C言語初心者にも分かりやすく教えて欲しいこと。
  • 質問者の環境はWindows VistaでVisual C++ 2008を使用している。
回答を見る
  • ベストアンサー

ファイルから入力した文字数をカウントして出力する。

ファイルから入力した文字数をカウントしてファイルに出力するプログラムをVC++のC言語を使ってビルドしたのですが警告が出ます。 何処が拙いのでしょうか? 教えて下さい。 実行環境はOSがWindows Vistaで統合開発環境がVisual C++ 2008です。 C言語初心者なので分かりやすく教えて下さい。 /* count_char.c */ #include <stdio.h> #include <stdlib.h> /* for exit(); */ int main(int argc, char *argv[]) { FILE *fin, *fout; int len; int ch; char ss[80]; if (argc != 3) { printf("引数の数が違います、エラー。用法:count_char fromfile tofile\n"); exit(1); } if ((fin = fopen(argv[1], "r")) == NULL) { printf("読み込みファイル%sがオープン出来ません。\n", argv[1]); exit(1); } if ((fout = fopen(argv[2], "w")) == NULL) { printf("書き込みファイル%sがオープン出来ません。\n", argv[2]); exit(1); } len = 0; while ((ch = fgetc(fin)) != EOF) { len++; } sprintf(ss, "文字数=%d\n", len); fputs(ss, fout); fclose(fin); fclose(fout); return 0; } 警告の内容は以下の通りです。 1>------ ビルド開始: プロジェクト: count_char, 構成: Debug Win32 ------ 1>コンパイルしています... 1>count_char.c 1>c:\vc9\count_char\count_char\count_char.c(16) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(237) : 'fopen' の宣言を確認してください。 1>c:\vc9\count_char\count_char\count_char.c(20) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(237) : 'fopen' の宣言を確認してください。 1>c:\vc9\count_char\count_char\count_char.c(30) : warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(366) : 'sprintf' の宣言を確認してください。 1>マニフェストをリソースにコンパイルしています... 1>Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0 1>Copyright (C) Micros

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

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

fopen()で警告が出るのはstdio.hを見れば解ると思うのですが、通常 fopen(const char *, const char *); となっており、宣言とコードが食い違うためと考えられます。 また現在ではfopen_s()を使用することがMicrosoftで推奨されています。 詳細は以下のサイトを御覧ください。 http://msdn.microsoft.com/ja-jp/library/z5hh6ee9(v=VS.80).aspx

C_Syoshinnsya
質問者

お礼

どうもありがとうございました。

その他の回答 (1)

回答No.1

↓このあたりを読まれることをお勧めします。 http://msdn.microsoft.com/ja-jp/library/8ef0s5kh(v=VS.80).aspx http://msdn.microsoft.com/ja-jp/library/z5hh6ee9(VS.80).aspx

C_Syoshinnsya
質問者

お礼

どうもありがとうございました。

関連するQ&A

  • ファイルの入出力を行って文字を変換する

    入力するファイルにa~zを記入しておき、 出力するファイルにaなら1、bなら2、zなら26に変換させたいのですがどうしたらよいでしょうか? #include <stdio.h> #include <string.h> #define DELIMITER "/ ," /* 区切り文字 */ int main(void) { FILE *fin,*fout; int count=0; int i; char s[256], s2[256]; char alpha[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; int kazu[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26}; char *taken; char *strch[50]; if( (fin=fopen("file1.txt","r"))==NULL) { printf("入力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } if( (fout=fopen("file2.txt","w"))==NULL) { printf("出力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } while(fgets(s,256,fin)!=NULL) { while (token != NULL) { strch[count]=token; token = strtok(NULL, DELIMITER); count++; } memset(s2, NULL, sizeof(s2)); fprintf(fout,"%d\n",s2); } fclose(fin); fclose(fout); return 0; }

  • ファイルの入出力を行っての文字列反転

    入力した文字列を反転させて出力したいのですが どうしたらよいでしょうか? #include <stdio.h> #include <stdlib.h> #include <string.h> /* 定数 */ #define DELIMITER "/ ," /* 区切り文字 */ int main(void) { FILE *fin,*fout; char infile[40],outfile[40],s[256],s2[256]; char *token; char *strch[50]; int count = 0; int i; printf("入力ファイル名="); gets(infile); printf("出力ファイル名="); gets(outfile); if( (fin=fopen(infile,"r"))==NULL) { /* 入力ファイルオープン */ printf("入力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } if( (fout=fopen(outfile,"w"))==NULL) { /* 出力ファイルオープン */ printf("出力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } while(fgets(s,256,fin)!=NULL) { /* 入力ファイルから読み込んだデータを */ token = strtok(s, DELIMITER); while (token != NULL) { strch[count] = token; token = strtok(NULL, DELIMITER); count++; } for(i = count; i > 0; i--) { strcat(s2, strch[i]); } fputs(s2,fout); /* 出力ファイルに書き込み */ } fclose(fin); /* 入力ファイルクローズ */ fclose(fout); /* 出力ファイルクローズ */ return 0; }

  • Cでファイルの行数をカウントするには

    ファイルの中の行数をカウントするにはどうすればよいか プログラムの行数ならその行数分だけ またコメントや空白行もカウントするにはどうしたらよいか 以下のプログラムに追加したい場合どうしたらよいか教えてください。 #include <stdio.h> int main(int argc , char *argv[]){ char s[256]; int i; FILE *fin; int local; int nCount = 0; for(i = 1 ; i < argc ; i++){ printf("%s\n",argv[i]); local = 0; fin=fopen(argv[i],"r"); memset(s,0,sizeof s); while(fgets(s,sizeof s,fin) != NULL){ // printf("%s",s); local++; nCount++; } memset(s,0,sizeof s); while(fgets) printf("local count = %d\n",local); fclose(fin); } printf("grobal count = %d\n",nCount); return 0; }

  • コンパイルできない

    c言語をはじめたばかりの初心者です。"typ.c"というソースファイルをメモ帳でつくって、コマンドプロンプト上でコンパイルしようとしたのですが、うまくいきませんでした。typ.cファイルの内容は *typ.c*/ #include <stdio.h> #include <stdlib.h> /*for exit()*/ int main(void) { FILE *fin, *fout; char buf[256]; char filename1[80], filename2[80]; printf("入力ファイル名="); gets(filename1); printf("出力ファイル名="); gets(filename2); fin = fopen(filename1, "r"); if (fin == NULL){ printf("%sをオープンできません\n", filename1); exit(1); } fout = fopen(filename2, "w"); if (fout == NULL){ printf("%sをオープンできません\n", filename2); exit(1); } while (fgets(buf, 256, fin) != NULL){ fputs(buf, fout); } fclose(fin); fclose(fout); return 0; } となっています。 いざコマンドプロンプト上でコンパイルしようとすると  C:Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\stdio.h(189) : error C20 27: 認識できない型'PostAttribute'が使れています。 c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(71) : 'PreAttribute'の宣言を確認してください。 という注意書きが大量にでてきて最後に C:Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\stdio.h(239) : fatal err or C1003: プログラム内のエラーが100個を超えました。コンパイルは中断されます。                         となってしまいます。 使っているOSはwindows vista で コンパイラはMicrosoft Visual C++ 2008 Express Edition です。 どうしたらよいのかわかりません。 どうか教えてください。 説明に不足があればまた足しますのでよろしくお願いします。

  • Visual C++ 2008 Expreesのコンパイルについて

    夜も遅くに申し訳ありません 現在、Visual C++ ExpressでCのソースを書いているのですが 以下のような警告がでてしまいます 1>------ ビルド開始: プロジェクト: addres2, 構成: Release Win32 ------ 1>コンパイルしています... 1>strling.c 1>.\strling.c(19) : warning C4090: 'return' : 異なる 'const' 修飾子です。 1>.\strling.c(67) : warning C4090: 'return' : 異なる 'const' 修飾子です。 1>save.c 1>.\save.c(8) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h(237) : 'fopen' の宣言を確認してください。 1>namesort.c 1>nameret.c 1>.\nameret.c(20) : warning C4996: 'gets': This function or variable may be unsafe. Consider using gets_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h(279) : 'gets' の宣言を確認してください。 1>main.c 1>.\main.c(30) : warning C4996: 'gets': This function or variable may be unsafe. Consider using gets_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h(279) : 'gets' の宣言を確認してください。 1>load.c 1>.\load.c(15) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h(237) : 'fopen' の宣言を確認してください。 1>key.c 1>input.c 1>.\input.c(13) : warning C4996: 'gets': This function or variable may be unsafe. Consider using gets_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h(279) : 'gets' の宣言を確認してください。 1>.\input.c(28) : warning C4996: 'gets': This function or variable may be unsafe. Consider using gets_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h(279) : 'gets' の宣言を確認してください。 1>.\input.c(31) : warning C4047: '関数' : 間接参照のレベルが 'char *' と 'char (*)[64]' で異なっています。 1>.\input.c(31) : warning C4024: 'InputKey' : の型が 1 の仮引数および実引数と異なります。 1>リンクしています... 1>コード生成しています。 1>コード生成が終了しました。 1>マニフェストを埋め込んでいます... 1>ビルドログは "file://g:\プログラム\addres2\addres2\Release\BuildLog.htm" に保存されました。 1>addres2 - エラー 0、警告 10 ========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ========== 一応は正常終了するのですが実行ファイル(exe)が生成されません 原因を探そうとネットを漁ってみたのですが判らないままです。 警告を全て消さないといけないのでしょうか? 申し訳ありませんが教えてください

  • ファイル入出力で

    現在ファイル入出力の項目をしているのですが、以下の内容で実行すると エラーが出てどうしても実行できません。主にどこを直せばいいのでしょうか? /* ファイルをコピーするプログラム */ #include <stdio.h> int main(void) { FILE *fin, *fout; char infile[40], outfile[40]; char str[256]; printf("コピー元ファイル = "); scanf("%39s", infile); printf("コピー先ファイル = "); scanf("%39s", outfile); if( (fin = fopen(infile, "r") ) == NULL) { printf("Input file open error.\n"); return 1; } if( (fout = fopen(outfile, "w") ) == NULL) { printf("Output file open error.\n"); fclose(fin); return 1; } while(fgets(str, sizeof(str), fin) != NULL) { fputs(str, fout); } fclose(fin); fclose(fout); return 0; } エラーは FILE 、fin, fout,NULLの未定義です。 よろしくお願いします。

  • コマンドラインから引数を渡すことについて

    ----------------------------------------------- #include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[ ]) { FILE *fin,*fout; char ss[256]; if(argc != 3){ printf("引数の数が違います\n"); exit(1); } if((fin=fopen(argv[1],"r"))==NULL){ printf("入力ファイルをオープンできません\n"); exit(1); } if((fout=fopen(argv[2],"w"))==NULL){ printf("出力ファイルをオープンできません\n"); exit(1); } while(fgets(ss,256,fin)!=NULL){ fputs(ss,fout); } fclose(fin); fclose(fout); return 0; } ----------------------------------------------- 以上のプログラム名は「tcopy.cpp」でコマンドプロンプトから実行し、ファイルをコピーするという事を行っていきます。 「aaa.txt」と「bbb.txt」の2つを用意し、「aaa.txt」の内容、 abcdef ABCDEF 012345 を「bbb.txt」にコピーしていきます。 そこで疑問なのですが、ファイルをコピーする際、コマンドプロンプトから、 >tcopy aaa.txt bbb.txt と打ち込むとコピー出来るようであり、「tcopy」、「aaa.txt」、「bbb.txt」が引数になるという事なのですが、何故この3つが引数になるのかという事と、 int main(int argc,char *argv[ ]) のargcに引数が何故代入されるかが分かりません。 後、「aaa.txt」と「bbb.txt」がargv[1]とargv[2]に何故対応しているかが分かりません。 教えていただければ嬉しいです。

  • ファイル中のデータの読むとき・・・・

    こんにちは。ファイルにあるテキストデータを用意してそれを読み込んでいって、処理をするというプログラム書いてるんですけど、たとえば 大まかな構造として、 int fncCheck(char*pch,char item) { int count=0; int i=0; for(i=0;i<strlen(pch);i++) {if(pch[i]==item) { count++; } } return count; } int main() { FILE *fin,*fout;  //ここでいろいろ宣言 if((fin=fopen("Thermoplasmaacidophilum ","r"))==NULL) { cout<<"No files exist in current directory!\n"; exit(-1); } if((fout=fopen("Thermoplasmaacidophilum _out","wb"))==NULL) { cout<<"Output file can't open!\n"; exit(-1); } if((fin=fopen("Thermoplasmaacidophilum ","r"))!=NULL) { fwrite(SMF_header,14,1,fout); fwrite(SMF_firsttrack,36,1,fout); fwrite(SMF_track,13,1,fout); do {    //ここにdoに関する処理 } while(numread==100); while(c=fscanf(fin,"%c",c)!=EOF) {   //ここに処理をずらずら } printf("There are %d bases!!\n",n); fclose(fin); fclose(fout); } return 0; } ・・・のように書くと、一つ目のdo-while文は実行されるんですが、二つ目のwhile文が実行されません。一回目でファイルのデータを最後まで読んでるので、元にもどってもう一回やってくれないんでしょうか?初心者なものでそこらへんがよくわかんないんですが・・。どなたか助けてください。

  • ファイルの英字を全部小文字に変換して新規テキストに出力

    テキストファイルの英字を全部小文字に変換して新規テキストに出力するプログラムをつくりましたがうまくいきません。なにがいけないですか? #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define STR_MAX 256 int main(void) { FILE *fi, *fo; /* ファイルポインタ用 */ char fin[100], fout[100]; /* ファイル名用 */ char buff[STR_MAX], *q; /* 文字列用 */ printf("入力ファイル名 : "); /* プロンプト表示 */ gets(fin); /* ファイル名入力 */ printf("出力ファイル名 : "); /* プロンプト表示 */ gets(fout); /* ファイル名入力 */ q = buff;   /* 入力ファイルオープン */ if((fi = fopen(fin, "r")) == NULL){ printf("入力ファイルがオープンできません\n"); exit(1); /* 強制終了 */ }   /* 出力ファイルオープン */ if((fo = fopen(fout, "w")) == NULL){ printf("出力ファイルがオープンできません\n"); exit(1); /* 強制終了 */ } while(fgets(buff, STR_MAX, fi) != NULL){ /* 1行読み込み */ *q = tolower(*q); ++q; fprintf(fo, "%s", buff); /* 1行出力 */ } fclose(fi); /* 入力ファイルクローズ */ fclose(fo); /* 出力ファイルクローズ */ return(0); }

  • ライブラリ関数

    文字列をコピーする(strcpy) 文字列の長さを調べる(strlen) 配列の長さを調べる(sizeof) #include <stdio.h> #include <string.h> int main(void) { char s1[128] = "ABCD"; char s2[128] = "EFGH"; char s3[128] = "IJKL"; strcpy(s2, s1); strcpy(s3, s2); puts("s1をs2にs2をs3にコピーしました。"); printf("s1 = %s\n", s1); printf("s2 = %s\n", s2); printf("s3 = %s\n", s3); printf("文字列%sの長さは%uです。\n",s3,(unsigned)strlen(s3)); printf("文字列%sの長さは%uです。\n",s3,strlen(s3)); return (0); } char *strcpy(char *d, const char *s) { while (*d++ = *s++) printf("pointer=%s \n",d); } /* 文字列sをdにコピーする[配列版] */ char *strcpy(char d2[], const char s2[]) { unsigned i=0; while (d2[i] = s2[i]){ i++; printf("hairetsu=%s\n",&d2[i]); } } /*--- 文字列strの長さを返す[ポインタ版] ---*/ size_t strlen(const char *s) { size_t len = 0; while (*s++) len++; return (len); } /*--- 文字列strの長さを返す[配列版] ---*/ unsigned strlen(const char str[]) { unsigned len = 0; while (str[len]) len++; return (len); } c:\program files\microsoft visual studio 8\vc\include\string.h(73) : 'strcpy' の宣言を確認してください。 メッセージ: 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.' c:\program files\microsoft visual studio 8\vc\include\string.h(73) : 'strcpy' の宣言を確認してください。 メッセージ: 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.' c:\documents and settings\owner\my documents\visual studio 2005\projects\test8-3\test8-3\test8-3.c(48) : error C2084: 関数 'char *strcpy(char *,const char *)' は既に本体を持っています。 c:\program files\microsoft visual studio 8\vc\include\string.h(73) : 'strcpy' の前の定義を確認してください c:\documents and settings\owner\my documents\visual studio 2005\projects\test8-3\test8-3\test8-3.c(68) : error C2084: 関数 'size_t strlen(const char *)' は既に本体を持っています。 c:\program files\microsoft visual studio 8\vc\include\string.h(80) : 'strlen' の前の定義を確認してください 上記の問題が解決できません。助けてください><

専門家に質問してみよう