コードにはいくつかの問題があります。
- 各変数の5つの要素をファイルに書き込んでいますが、各変数には3つの要素しかないため、バッファオーバーフローが発生します。
- getname、getid変数は単なるポインターであり、それらのストレージはありません
これらのエラーを見つけるには、デバッガーを使用してステップスルーできる必要があります。
動作するコードは次のとおりです。
#include <stdio.h>
#include <stdlib.h>
int main(){
/*Variable for writing to file */
char *name[] = {"Raju", "Nayan", "Hanif"};
char *id[] = {"100", "101", "102"};
float cgpa[] = {3.50, 5.00, 4.00};
/*Variable for reading from file*/
// need storage space
char getname[40], getid[40];
float getcgpa;
int i;
FILE *fp;
fp = fopen("raju.nog", "w"); /*Create new file */
// Only 3 elements
for(i=0; i<3; i++){
fprintf(fp, "%-10s%-10s%-1.2f\n", name[i], id[i], cgpa[i]); /*write to file*/
}
fclose(fp);
/*read from file and print to screen*/
fp = fopen("raju.nog", "r");
while(fscanf(fp, "%s %s %f", &getname, &getid, &getcgpa) != EOF){
printf("%-10s%-10s%-1.2f\n", getname, getid, getcgpa);
}
return(0);
}
gdbにアクセスできる場合は、最初の問題を見つけ、次に2番目の問題を見つけることができます。これは、コードで最初のエラーを引き起こしている行を指摘している私のGDBセッションのログです。
(gdb) run
Starting program: /home/jrn/SO/a.out
Program received signal SIGSEGV, Segmentation fault.
0x005cc35e in vfprintf () from /lib/libc.so.6
(gdb) bt
#0 0x005cc35e in vfprintf () from /lib/libc.so.6
#1 0x005d33cf in fprintf () from /lib/libc.so.6
#2 0x08048565 in main () at sowrong.c:15
(gdb) list
1 #include <stdio.h>
2 #include <stdlib.h>
3 int main(){
4 /*Variable for writing to file */
5 char *name[] = {"Raju", "Nayan", "Hanif"};
6 char *id[] = {"100", "101", "102"};
7 float cgpa[] = {3.50, 5.00, 4.00};
8 /*Variable for reading from file*/
9 char *getname, *getid;
10 float getcgpa;
(gdb) list
11 int i;
12 FILE *fp;
13 fp = fopen("f:\\raju.nog", "w"); /*Create new file */
14 for(i=0; i<5; i++){
15 fprintf(fp, "%-10s%-10s%-1.2f\n", name[i], id[i], cgpa[i]); /*write to file*/
16 }
17 fclose(fp);
18 /*read from file and print to screen*/
19 fp = fopen("f:\\raju.nog", "r");
20 while(fscanf(fp, "%s %s %f", &getname, &getid, &getcgpa) != EOF){
(gdb) list
21 printf("%-10s%-10s%-1.2f\n", getname, getid, getcgpa);
22 }
23 }
次の行に注意して#2 0x08048565 in main () at sowrong.c:15
ください。これは、15行目でセグメンテーション違反が発生したことを示しています。その後、ファイルを一覧表示して行を確認できます。
したがって、15行目を修正した後、プログラムを再度コンパイルし、GDBを介して実行して、2番目の問題を見つけます。これが私のGDBセッションのログです:
(gdb) run
Starting program: /home/jrn/SO/a.out
Program received signal SIGSEGV, Segmentation fault.
0x005cc35e in vfprintf () from /lib/libc.so.6
(gdb) bt
#0 0x005cc35e in vfprintf () from /lib/libc.so.6
#1 0x005d3410 in printf () from /lib/libc.so.6
#2 0x080485be in main () at sowrong.c:21
(gdb) list
1 #include <stdio.h>
2 #include <stdlib.h>
3 int main(){
4 /*Variable for writing to file */
5 char *name[] = {"Raju", "Nayan", "Hanif"};
6 char *id[] = {"100", "101", "102"};
7 float cgpa[] = {3.50, 5.00, 4.00};
8 /*Variable for reading from file*/
9 char *getname, *getid;
10 float getcgpa;
(gdb) list
11 int i;
12 FILE *fp;
13 fp = fopen("f:\\raju.nog", "w"); /*Create new file */
14 for(i=0; i<3; i++){
15 fprintf(fp, "%-10s%-10s%-1.2f\n", name[i], id[i], cgpa[i]); /*write to file*/
16 }
17 fclose(fp);
18 /*read from file and print to screen*/
19 fp = fopen("f:\\raju.nog", "r");
20 while(fscanf(fp, "%s %s %f", &getname, &getid, &getcgpa) != EOF){
(gdb) list
21 printf("%-10s%-10s%-1.2f\n", getname, getid, getcgpa);
22 }
23 }
もう一度、次の行に注意して#2 0x080485be in main () at sowrong.c:21
ください。2番目のSEGFAULT。変数は単なるポインターであり、ストレージスペースがないためです。