• 締切済み

ファイル入出力で

現在ファイル入出力の項目をしているのですが、以下の内容で実行すると エラーが出てどうしても実行できません。主にどこを直せばいいのでしょうか? /* ファイルをコピーするプログラム */ #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の未定義です。 よろしくお願いします。

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

> エラーメッセ-ジは > 未定義のシンボルFILE(関数Main) > 未定義のシンボルfin(関数Main) > 未定義のシンボルfout(関数Main) > ここでは宣言できない > ここでは宣言できない > 未定義のシンボルNULL > と表示されました。 このエラーメッセージで間違いありませんか? Main関数というのは存在しないはずですが... 何か別のファイルをコンパイルしようとしているとか、コンパイラが悪意を持って書き換えられているとか、(この通りのエラーメッセーが出力されたとすれば)尋常ではない状態に陥っていると思います。

sheran
質問者

お礼

回答ありがとうございました。 その後やってみたのですが、やはりできませんでした。 また一からやってみます。 ありがとうございました。

sheran
質問者

補足

回答ありがとうございました。返事遅くなり申し訳ありませんでした。 その後一からやり直してみたのですが、コンパイル時点で外部シンボルWinmainが未解決と表示されるのですがこの表示の意味は何なのでしょうか? よろしければ回答お願いします。 ありがとうございました。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

ソースを見る限り、特に問題はなさそうです。 使用している処理系と、コンパイルオプション、エラーメッセージの全文を補足してください。

sheran
質問者

お礼

回答ありがとうございました。 その後やってみたのですが、やはりできませんでした。 また一からやってみます。 ありがとうございました。

sheran
質問者

補足

回答ありがとうございました。遅くなり申し訳ありません。 OSはWindowsMeです。コンパイルオプションは一応環境設定の要らないsetbcc.exeとBCCDeveloperを利用しています。あとborlandC++を使ってます。 エラーメッセ-ジは 未定義のシンボルFILE(関数Main) 未定義のシンボルfin(関数Main) 未定義のシンボルfout(関数Main) ここでは宣言できない ここでは宣言できない 未定義のシンボルNULL と表示されました。 ただFILE *fin, *fout;を他に言い換えるとコンパイラでき、実行結果が コピー元ファイル= 上記に入力すると同じく コピー先ファイル= の表示がされたんですが、 FILE *fin, *fout;がないのとでは結果どう影響するでしょうか? よろしくおねがいします。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

提示されたソースをBCC32でコンパイルしてみました。正常にコンパイルできました。エラーはありません。使用されているコンパイラ及びOSを提示してください。

sheran
質問者

お礼

回答ありがとうございました。 その後やってみたのですが、やはりできませんでした。 また一からやってみます。 ありがとうございました。

sheran
質問者

補足

回答ありがとうございました。遅くなり申し訳ありません。 OSはWindowsMeでコンパイルはborlandC++を使用し環境設定の要らないSetbcc.exeとBccDeveloperを使ってます。 よろしくお願いします。

noname#39970
noname#39970
回答No.1

そのまんま。 取り込んでるヘッダに「FILE」と「NULL」が#defineで定義されてない って事なんだけど・・・・・NULLはどうとしてもなんでFILEが無いんだろうね。 C++で作っちゃっててとか そういうオチだったり?

sheran
質問者

お礼

回答ありがとうございました。 その後やってみたのですが、やはりできませんでした。 また一からやってみます。 ありがとうございました。

sheran
質問者

補足

回答ありがとうございます。遅くなり申し訳ありません。 #define でNULLとFILEを宣言してコンパイルしてみたのですが、やはりエラーメッセージがでました。 全文は 未定義のシンボルfin 未定義のシンボルfout ここでは宣言できない ここでは宣言できない が表示されました 。 それでFILE *fin, *fout;をint型で言い換えるとコンパイルできるのですが。 FILE *fin, *fout;なしではいけないという事なんでしょうか? C++でしてしまってるということはありえないです。 よろしければ回答お願いします。

関連するQ&A

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

    入力した文字列を反転させて出力したいのですが どうしたらよいでしょうか? #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; }

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

    入力するファイルに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 <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); }

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

    こんにちは。ファイルにあるテキストデータを用意してそれを読み込んでいって、処理をするというプログラム書いてるんですけど、たとえば 大まかな構造として、 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文が実行されません。一回目でファイルのデータを最後まで読んでるので、元にもどってもう一回やってくれないんでしょうか?初心者なものでそこらへんがよくわかんないんですが・・。どなたか助けてください。

  • ファイルの入出力プログラムについて

    san.txtに(I can do it )と書いて以下のプログラムを実行したらメ噫|リ メ噫|リ メ噫|リ メ噫|リ メ噫|リ メ噫| とバグってしまいました。なぜですか? #include <stdio.h> #include <stdlib.h> main () { FILE *outfp; char str[256];    if (( outfp = fopen("san.txt", "w"))       ==NULL) { printf("ファイルオープンエラー\n"); exit(1); } while(fputs(str, outfp)){ printf("%s", str); } fclose(outfp); return 0; }

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

    ----------------------------------------------- #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]に何故対応しているかが分かりません。 教えていただければ嬉しいです。

  • ファイル入出力について

    次のようなプログラムを作りました。 コマンドラインから二つのファイルの名前を読み取り、最初の引数のファイルを2番目の引数のファイルにコピーするプログラムです。 質問は下のプログラムのコメント /*この行が質問です*/ の所です。 //ファイルをコピーする の部分の始めに while(!feof(from)) という条件を書いているため、/*この行が質問です*/ の行は不要であると思いましたが、実際にこの一行をのぞいてコンパイルして実行したところ、日本語が文字化けしてコピーされてしまいました。その後、この行を追加してコンパイルして実行すると文字化けもなく実行できました。 なぜこの行が必要なのでしょうか。 よろしくお願いします。 //ファイルコピー #include<stdio.h> #include<stdlib.h> int main(int argc, char *argv[]) {   FILE *from, *to;   char ch;   //引数の数の確認   if (argc != 3) {     printf("引数の数が違います");     exit(1);   }   //コピー元ファイルを開く   if ((from = fopen(argv[1],"r")) == NULL ) {     printf("コピー元ファイルオープンエラー");     exit(1);   }   //コピー先ファイルを開く   if ((to = fopen(argv[2],"w") )== NULL ) {     printf("コピー先ファイルオープンエラー");     exit(1);   }   //ファイルをコピーする   while (!feof(from)) {     ch = fgetc(from);     if(ferror(from)) {       printf("コピー元ファイル読み込みエラー");       exit(1);     }     if (!feof(from))       /*この行が質問です*/       fputc(ch,to);     if (ferror(to)) {       printf("コピー先ファイル書き込みエラー");       exit(1);     }   }   if (fclose(from) == EOF) {     printf("コピー元ファイルクローズエラー");     exit(1);   }   if (fclose(to) == EOF) {     printf("コピー先ファイルクローズエラー");     exit(1);   }   return 0; }

  • 昇順ソート

    sort.txtから読み込んだ値を 昇順でソートして出力するにはどうしたらよいでしょうか? #include <stdio.h> #include <stdlib.h> #include <string.h> #include <search.h> /* 比較関数 */ int strcmp_asc(const void *, const void *); int main(void) { FILE *fin, *fout; int i; int length; char s[256], s2[256]; if( (fin=fopen("sort.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) { /* 要素数を求める */ length = sizeof(s) / 256; /* 昇順でソート */ qsort(s, length, 256, strcmp_asc); /* memset(s2, NULL, sizeof(s2)); for (i = 0; i < length; i++) { } */ fprintf(fout,"%s\n",s2); } fclose(fin); fclose(fout); return 0; } int strcmp_asc(const void *sa, const void *sb) { return strcmp((char *)sa, (char *)sb); } sort.txt 50 45 35 25 15 10 5 1 32 46 8 7 9 19 18 14 16 13 12 17 11 20 40 30 31 3 2 37 38 36 33 39 34 49 47 48 4 6 44 42 43 41 21 22 26 24 28 29 27 23

  • CSVファイルの入出力と計算

    C言語の質問です。 勉強不足で聞くのは申し訳ないのですが、 自分であれこれとやってみて、どうしていいのか分からなくなってしまいました。 csvファイルの中身は、6行目までは不要な文字列などが入っていて、7行目から使いたい数値となっています。その数値は5桁と分かっています。 さらに、データ数としては、約300000行~10000000行とデカイ上に定まっていません。 その数値に値をかけて変換してファイルとしてだしたいのですが、どうすればよいのでしょうか? 下のようなイメージ↓(値はテキトー) *********************************** 元ファイル→掛ける値→後ファイル 54321→→ *10/12365→ 1.4243 : : : : ************************************ 以下は自分で書いたものですが、 ????????????にしてあるあたり(ファイルを読み込む部分) がどうすればいいかわかりません。 変数が色々あるのは迷走の証です。 どうぞ、よろしくお願いします。 int main(){ FILE *in,*out; char fname1[30],fname2[30]; char s[5]; double n1; int n,i=0; int start=7; int line=0; printf("読み込むファイル名を入力してください\n"); scanf("%s",&fname1); in=fopen(fname1,"r"); out=fopen(fname2,"r"); if(in==NULL){ printf( "ファイルが開けません\n",fname1); return -1; } else{ ???????????????????? ?????????????????? printf("%d \n",n1); fprintf(out,"%s \n",n1); } } printf("書き込むファイル名を入力してください\n"); scanf("%s",&fname2); fclose(in); fclose(out); return 0; }

  • 文字列入れ替えのプログラムについて

    こんばんは。 文字列入れ替えのプログラムを作っているのですが、分からない部分があるので教えて頂きたいです。 入力ファイルには、 AAAAAAA(必ず7文字)【半角スペース】B(文字数はバラバラ)【tab】C(文字数はバラバラ) というデータが複数入っているものとします。 このファイルを読み込んで、 B【tab】C;;;(セミコロン3つ)AAAAAAA という順に並べ替えるプログラムを作成したいと考えています。 アルゴリズムとしては、 (1)ファイルから1行読み込む (2)読み込んだ行のうち最初の7文字を配列に保存 (3)半角スペースを除き、それ以降(B【tab】C)を出力ファイルに書き込む (4)(2)で保存したものに;;;をつけ、(3)の後ろに書き込む というのを考えていますが、(3)の工程をどうすればいいか分からず困っています。 (改行(\n)までをファイルに書き込めばいいと思うのですが、プログラムでどう書けばいいかが分かりません) よろしくお願いします。 #include<stdio.h> void main(void){ FILE *fin; FILE *fout; char buff[200]; char *p1; char word[200]; int i=0; /*読み込み用ファイルを開く*/ fin = fopen("input.txt", "rt"); if( fin == NULL ){ printf( "File open error1\n" ); return; } /*書き込み用ファイルを開く*/ fout = fopen("output.txt", "wt"); if( fout == NULL ){ printf( "File open error2\n" ); return; } /*1行ずつ読み込む*/ /*読み込める間繰り返す*/ while(fgets(buff,200,fin) != NULL){ i=0; /* buffの先頭アドレスをp1に与える*/ p1=buff; /*工程2:最初から7文字分を配列wordに保存*/ for (i=0;i<7;i++){ word[i]=*p1; *p1++; } /*半角スペース部分をとばし、p1をBの最初の文字にする*/ *p1++;      ここで工程3を行う     /*工程4:保存しておいた文字列を書き込む*/ fprintf(fout,";;;%s\n",word); } fclose(fin); fclose(fout); }

専門家に質問してみよう