• 締切済み

fputs:ファイル操作

Cを勉強している初心者です。 このソースはコンパイルは通るのですが、 エラーがでてしまいます。 いろいろと調べてみたりもしたのですが わかりませんでした。 なぜなのでしょうか? #include <stdio.h> #include <string.h> struct student{ char name[20]; }; int main(void) { struct student s[1]; int i; int j = 1; FILE *fp; strcpy(s[0].name,"taro"); strcpy(s[1].name,"jiro"); if((fp = fopen("test.txt","w+")) == NULL) { printf("ファイルを開けませんでした\n"); return (-1); } for(i=0;i<=j;i++) { fputs(s[i].name,fp); } fclose(fp); return (0); }

みんなの回答

  • 1839cc
  • ベストアンサー率54% (12/22)
回答No.1

struct student s[1]; この宣言は、配列の要素数は1つという意味です。 ですので、s[0]にアクセスするのは正しいのですが、 s[1]にアクセスしてはいけません。 つまり、以下の2行は、不正なメモリアクセスになってしまいます。 strcpy(s[1].name,"jiro"); for(i=0;i<=j;i++)

関連するQ&A

  • fpus:ファイル操作

    Cを勉強している初心者です。 このソースはコンパイルは通るのですが、 エラーがでてしまいます。 いろいろと調べてみたりもしたのですが わかりませんでした。 なぜなのでしょうか? #include <stdio.h> #include <string.h> struct student{ char name[20]; }; int main(void) { struct student s[1]; int i; int j = 1; FILE *fp; strcpy(s[0].name,"taro"); strcpy(s[1].name,"jiro"); if((fp = fopen("test.txt","w+")) == NULL) { printf("ファイルを開けませんでした\n"); return (-1); } for(i=0;i<=j;i++) { fputs(s[i].name,fp); } fclose(fp); return (0); }

  • ファイル操作やポインタ、構造体について(C言語)

    C言語の課題で詰まってしまいました。宜しければ助言を宜しくお願いします。 コマンド選択で,0) 終了,1) 追加,2) 検索(id),3)変更 が行える学生成績管理プログラムを作成する。 データは,学生の番号 名前 GP 総単位数 形で学生のデータを持っているファイルである。 #include<stdio.h> #include<stdlib.h> #include<string.h> struct student{ int id; char name[25]; int gp; int credit; }; void add(char *, struct student);//追加 int search(char *, struct student *);//検索 void change(char *, struct student);//指定したidの学生の情報を変更 main(int argc,char *argv[]) { FILE *fp; int i = 0; int num; struct student students; if(argc == 1){ printf("set filename\n"); return 1; } while(1) { printf("1)add 2)search 0)quit "); scanf("%d",&num); if(num == 0) break; /* 追加 */ if(num == 1) { printf("id name gp credit ? "); scanf("%d %s %d %d", &students.id, students.name, &students.gp, &students.credit); add(argv[1], students); } /* 検索 */ if(num == 2) { printf("id ? "); scanf("%d", &students.id); if(search(argv[1],&students)){ printf("%d %s %d %d\n", students.id, students.name, students.gp, students.credit); } else{ printf("ID %d Not Found.\n",students.id); } } if(num == 3){ //変更 } } } /* 追加ルーチン */ void add(char *filename, struct student students) { FILE *fp; if((fp = fopen(filename, "a")) == NULL){ printf("can't open %s\n", filename); exit(1); } fprintf(fp,"%d %s %d %d\n", students.id, students.name, students.gp, students.credit); fclose(fp); } /* 検索ルーチン */ int search(char *filename, struct student *students) { FILE *fp; int id; char name[25]; int gp; int credit; if((fp = fopen(filename, "r")) == NULL){ printf("can't open %s\n", filename); exit(1); } while(fscanf(fp,"%d %s %d %d", &id, name, &gp, &credit) != EOF) { if(id == students->id){ students->id = id; strcpy(students->name ,name); students->gp = gp; students->credit = credit; return 1; } } return 0; fclose(fp); } /* 変更ルーチン */ void add(char *filename, struct student students){ } ------------ここまで------------ ファイルの操作での入出力は"a"や"r"、また"w"を利用するのかとも思いましたが、 指定したIDの内容を書き換えるにはポインタを2つ使う方法しか思いつかないのですが、与えられた問題で、変更のプロトタイプは void change(char *, struct student); となっていて、どうやるのかまったく見当もつきません。 稚拙な文で伝わりにくいかもしれませんが、 変更のやり方についてご教授願います。 見難くて申し訳ありません。 どうか宜しくお願いします。

  • C言語 アロー演算子

    このようなプログラムを作りたいのですが上手くいきません。 (入力と出力は必ずアロー演算子を使う。) <実行例> 番号を入力:1 名前を入力:taro 番号:1 名前:taro どなたかよろしくお願い致します #include <stdio.h> #include <string.h> typedef struct{ int no; char name[21]; }student; void in(student *std){ char namae[21]; int bango,i=0; scanf("%d", &bango); std->no = bango; while(1){ namae[i] = getchar(); if((i >= 20 ) || (namae[i] == '\n')) break; i++; } i++; namae[i] ='\0'; strcpy(std->name,namae); } void out(student *std){ printf("%d\n", std->no); printf("%s\n", std->name); } main(){ student person; in(&person); out(&person); return 0; }

  • 成績表示プログラム

    class Test { String subject; int point; void SetPoint(String s, int p) { subject = s; point = p; } String getPoint() { return subject + ":" + point; } } class Student { int id; String name; int subnum; Test[] test; Student(int i, String n, int s) { id = i; name = n; subnum = s; test = new Test[s]; for(int j = 0; j < s; j++) test[j] = new Test(); } String getName() { return id + " " + name; } int getGrade() { int sum = 0; for(int i = 0; i < subnum; i++) sum += test[i].point; return sum; } // メソッドのオーバーロード int getGrade(int a) { int base = 100 * subnum / a; int rank = getGrade() / base + 1; return rank; } void printScore() { System.out.println(getName()); for(int i = 0; i < subnum; i++) System.out.print(test[i].getPoint() + " "); System.out.println(); System.out.println("合計点:" + getGrade()); int rank = 5; System.out.println("評 価:" + getGrade(rank)); System.out.println(); } } class ClassRoom { public static void main(String[] args) { Student taro = new Student(12, "taro", 3); taro.test[0].SetPoint("国 語", 95); taro.test[1].SetPoint("数 学", 83); taro.test[2].SetPoint("英 語", 76); taro.printScore(); Student jiro = new Student(7, "jiro", 3); jiro.test[0].SetPoint("国 語", 66); jiro.test[1].SetPoint("数 学", 97); jiro.test[2].SetPoint("英 語", 72); jiro.printScore(); } } このJavaのプログラムを画面上に表示させて、下記のようなプログラムを追加したいです。 国語「  」点 数学「  」点 英語「  」点 と言う画面で点を入力して「計算」を押すと 合計点「  」点 評価「  」 が表示されるようにしたいです。

  • ファイル操作(構造体)のエラー?なんでしょうか?

    ファイル操作(構造体)のエラー?なんでしょうか? テキストファイルtestdata.txtから読み込んで渡したいのですが 下記の画像のようなエラーがでます。 プログラムの問題ですか?パソコンのほかの問題ですか? DOSのWindowがまずいのでしょうか? testdata.txtの中身は半角英数字の羅列です。 例 123 456 789 AAA BBB #include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct data{ char *name; int a; int h; struct data *next; }LIST; int main(){ int i; int j; LIST *pt; FILE *fp; char *readLine; if((fp=fopen("testdata.txt","r"))==NULL){ printf("file error\n"); exit(1); } pt=(LIST *)calloc(4,sizeof(LIST)); i=0; j=0; while(fgets(readLine,256,fp)!=NULL){ if(i==0){ (pt+j)->name=(char *)malloc(strlen(readLine)+1); (pt+j)->name=readLine; printf("%s",(pt+j)->name); i++; }else if(i==1){ (pt+j)->a=atoi(readLine); printf("%d",(pt+j)->a); i++; }else if(i==2){ (pt+j)->h=atoi(readLine); printf("%d",(pt+j)->h); i=0; j++; } } free(pt); return 0; } コンパイルは無事終了してます。

  • 直接ファイルへ出力できるものでしょうか?

    構造体 struct{int i,int m}i を用意しています #include <stdio.h> typedef struct{ int i[6]; /*学生番号*/ int m[6]; /*身長*/ }stu int main(void){ FILE *fp; stu s; fp("text.txt","w"); while(gets(s)!=NULL){ fputs(s,fp); } fclose(fp); } これを動かそうと思ってもダメなのは自分でもよくわかります。 構造体へダイレクトにいれてファイル出力というのは無謀なのでしょうか? 一度構造体にきちんと取り込んだ後で改めてファイルへ出力するのが正式なのでしょうか? 教えてください

  • ディレクトリ内のファイル名取得

    maruchan と言うものです。 よろしくお願いします。 さっそく質問 環境 cygwin gcc version 3.3.1 やりたい処理は、ディレクトリ内の全てのファイル名を取得したいと思っています。 内容を見ると単純ですが、そのファイルの数が約10万ファイルぐらいありまして・・・ファイル名を取得するだけで結構な時間が掛かってしまいます。 そこで 私が質問したいのは 高速にファイル名を取得する方法はないのか知りたいです。 私が書いたサンプルです。 /*******************/ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <dirent.h> int fileSelector (const struct dirent *entry); int main(void) { int i = 0; int dirCnt = 0; struct dirent **dp = NULL; char dirPath[256]; strcpy(dirPath, "./file/"); dirCnt = scandir(dirPath, &dp, fileSelector, alphasort); for(i=0; i < dirCnt; i++) { /* 本来はここでファイル名を何かに登録する */ dp[i]->d_name; } free(dp); return 0; } int fileSelector (const struct dirent *entry) { if (strcmp (entry->d_name, ".") == 0 || strcmp (entry->d_name, "..") == 0) { return 0; } return 1; } /*******************/

  • ファイルを読み込むプログラム

    氏名、英語、数学が保存されているファイル(記入されている人数は不明とし100人まで読み込めるとする)を関数内で読み込んで個人の点数の平均値と、皆の数学の平均値、英語の平均値を関数内で定義して出力するプログラムを作りましたが、コンパイルはできても実行するとエラーが出ます。どこがおかしいか分かる人教えてください。 #include <stdio.h> #include<stdlib.h> #include<string.h> #define number 100 int n=0; //構造体を宣言する struct student {char Name[6]; double Math; double Eng; }; struct student *sset_student(char *buffer) { struct student *pss[number]; int ret; ret=sscanf(&buffer[0],"%s %lf %lf",&pss[0]->Name,&pss[0]->Math,&pss[0]->Eng); if(ret!=3) { puts("代入された入力項目の個数が3でありません"); return NULL; } return pss[0]; } struct student *fset_all_student(void) { int i; struct student *pss[number]; FILE *fpin; char buffer[20]; fpin=fopen("input.txt","r"); if(fpin==NULL) { fprintf(stderr, "入力するファイルが開きません"); return NULL; } while(fgets(&buffer[0],sizeof(buffer),fpin) !=NULL ) { pss[i]=sset_student(&buffer[0]); i++; } n=i; fclose(fpin); return pss[0]; } void get_student_average(struct student *pss) { double heikin; heikin=(pss->Math+pss->Eng)/2.0; printf("%sの平均点は%dです\n",pss->Name,heikin); } void get_average(struct student *pss) { int i; double msum=0; double esum=0; for(i=0;i<3;i++) { msum+=pss[i].Math; esum+=pss[i].Eng; } printf("数学の平均点は%dです\n",msum/n); printf("英語の平均点は%dです\n",esum/n); } int main(void) { int i; struct student *a[number]; for(i=0;i<n;i++) { a[i]=fset_all_student(); } for(i=0;i<n;i++) get_student_average(a[i]); get_average(a); return 0; }

  • ファイル読込時に構造体の文字列ポインタに割当てたいと

    ファイル読込時に構造体の文字列ポインタに割当てたいと思っています。 (new 演算子を使用します。) 文字列の長さが不定です。 どうすれば、文字列の長さを知ることができますか? 以下のようなところまでは作れましたが、 困っています。 void loaddata()のfscanf関数の部分です。 ほかにも関数の void outputdata() void deletedata() がありますが、長いので省略しました。 ********************************************************** #include<stdio.h> #include<string.h> class data { public: struct basic { char *name; int age; struct basic *next; }; private: struct basic *base; struct basic *base_top; int cnt; public: data::data() { cnt=0; } void inputdata(char *name,int age) { if(cnt==0) { base=new basic; base_top=base; base->age=age; int len=strlen(name); base->name=new char[len+1]; strcpy(base->name,name); cnt++; } else { base->next=new basic; base=base->next; base->age=age; int len=strlen(name); base->name=new char[len+1]; strcpy(base->name,name); cnt++; } } void savedata() { base=base_top; FILE *fp; fp=fopen("dat.txt","w"); for(int i=0;i<cnt;i++) { fprintf(fp,"%s\t%d\n",base->name,base->age); base=base->next; } fclose(fp); } void loaddata() { if(cnt!=0){deletedata();} cnt=0; FILE *fp; fp=fopen("dat.txt","r"); while(1) { fscanf(fp,"%s\t%d\n",base->name,base->age); } } };

  • findnext();について

    下のプログラムなのですが、 色々と調べていくとfindnext();でフリーズしてしまうことがわかりました。 しかし、なぜフリーズするのかわからないのです。 dir.hの書いてある通りに使っているつもりなのですが・・・ 助言お願いいたします。 仕事にいるので早急にお願いいたします。 ちなみにコンパイラはBC4.5++です。 /*****************************************************************/ test.c /*****************************************************************/ #include <stdio.h> #include <dir.h> #include <string.h> #define MAX 10 int main(){ struct ffblk *data; int i; char name[MAX]; char path[MAX]; strcpy(path,"c:\\*.*"); if(findfirst(path,data,0)==0){ while(1){ strcpy(name,data->ff_name); printf("%s",name); if(findnext(data)!=0)break; } } return 0; }

専門家に質問してみよう