teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

ソース追記

2019/04/24 03:15

投稿

cateye
cateye

スコア6851

answer CHANGED
@@ -7,4 +7,201 @@
7
7
  ・・あと「このソースコンパイル通ってますか?」
8
8
  case0: printf("役員\n");はcase 0: printf("役員\n");ですね?(他のcaseも)
9
9
  //
10
- 全体的にエラーチェックが抜けています。特にファイル操作についてはディスクそのものを壊してしまう可能性も有るのですべてチェックするようにしましょう。
10
+ 全体的にエラーチェックが抜けています。特にファイル操作についてはディスクそのものを壊してしまう可能性も有るのですべてチェックするようにしましょう。
11
+ 「追記」clang-formatでフォーマットしたものを貼り付けておきます。・・・これがベターではないですが^^;
12
+ ```c
13
+ #include <stdio.h>
14
+ #include <fcntl.h>
15
+ #include <memory.h>
16
+ #include <string.h>
17
+ //#include <io.h>
18
+ #include <errno.h>
19
+ #include <math.h>
20
+ #include <stdlib.h>
21
+ #include <sys/types.h>
22
+ #include <sys/stat.h>
23
+ /*********************************************************************/
24
+ /* 定数の定義 */
25
+ /*********************************************************************/
26
+ #define CR 0x0D
27
+ #define LF 0x0A
28
+ #define DATA "SYAIN.DAT"
29
+ /*********************************************************************/
30
+ /* 構造体の宣言 */
31
+ /*********************************************************************/
32
+ struct syain_k {
33
+ char sno[5]; /* 社員番号 */
34
+ char name[20]; /* 氏名 */
35
+ char salary[7]; /* 給与 */
36
+ char crlf[2]; /* CR/LF */
37
+ };
38
+ /*********************************************************************/
39
+ /* 静的変数の定義 */
40
+ /*********************************************************************/
41
+ /*********************************************************************/
42
+ /* 内部関数のプロトタイプ宣言 */
43
+ /*********************************************************************/
44
+ int numeric_chk(char *str, int n);
45
+ int search(char *sno, struct syain_k *rec);
46
+ void data_disp(struct syain_k *rec);
47
+ void touroku(int recno, char *sno, char *name, char *salary);
48
+ /*********************************************************************/
49
+ /* main() メイン関数 */
50
+ /*********************************************************************/
51
+ int Fd;
52
+ initial_syori()
53
+ {
54
+ Fd = open(DATA, O_RDWR | O_CREAT, S_IREAD | S_IWRITE);
55
+ }
56
+ main()
57
+ {
58
+ struct syain_k rdbuf;
59
+ int a;
60
+ long d;
61
+ int recno;
62
+ char sno[6];
63
+ char name[21];
64
+ char salary[8];
65
+
66
+ initial_syori();
67
+ while (1) {
68
+ printf("社員番号を入力してください\n");
69
+ scanf("%s", sno);
70
+ a = numeric_chk(sno, 5);
71
+ if (a == -1) {
72
+ printf("NUMERICエラー\n");
73
+ continue;
74
+ }
75
+ d = atol(sno);
76
+ if (d == 99999L) {
77
+ return 0;
78
+ } else if ((d < 1000L) || (d > 90000L)) {
79
+ printf("範囲エラー\n");
80
+ continue;
81
+ }
82
+ recno = search(sno, &rdbuf);
83
+ if (recno != 0)
84
+ data_disp(&rdbuf);
85
+
86
+ printf("氏名の入力\n");
87
+ scanf("%s", name);
88
+ printf("氏名[%s]\n", name);
89
+
90
+ printf("給与を入力してください\n");
91
+ scanf("%s", salary);
92
+ a = numeric_chk(salary, 7);
93
+ if (a == -1) {
94
+ printf("NUMERICエラー\n");
95
+ continue;
96
+ }
97
+ printf("給与:[%s]\n", salary);
98
+
99
+ touroku(recno, sno, name, salary);
100
+ }
101
+ }
102
+ /**************************************l*******************************/
103
+ /* 数字か文字かのチェック */
104
+ /* IN: char *str チェックを行う文字列 */
105
+ /* in: int n チェックを行う文字列のバイト数 */
106
+ /* 戻り値 0:全て数字: -1:数字以外の文字あり */
107
+ /*********************************************************************/
108
+ int numeric_chk(char *str, int n)
109
+ {
110
+ int i;
111
+ for (i = 0; i < n; i++) {
112
+ if ((str[i] >= '0') && (str[i] <= '9')) {
113
+ continue;
114
+ } else {
115
+ return (-1);
116
+ }
117
+ }
118
+ return 0;
119
+ }
120
+ /*********************************************************************/
121
+ /* レコードの検索処理 */
122
+ /* IN: *sno キー入力された社員番号 */
123
+ /* OUT: *rec 社員番号が一致した時の既存レコード */
124
+ /* 戻り値 0・・・存在しない */
125
+ /* 1~・・・既存のレコード番号 */
126
+ /*********************************************************************/
127
+ int search(char *sno, struct syain_k *rec)
128
+ {
129
+ int recno;
130
+ int n;
131
+ long a, b;
132
+ recno = 0;
133
+
134
+ a = atol(sno);
135
+ lseek(Fd, 0L, SEEK_SET);
136
+ while (1) {
137
+ n = read(Fd, &rec, sizeof(struct syain_k));
138
+ b = atol(rec->sno);
139
+ if (n == 0) {
140
+ recno = 0;
141
+ return 0;
142
+ } else {
143
+ recno++;
144
+ if (a == b)
145
+ printf("P1");
146
+ getch();
147
+ return recno;
148
+ }
149
+ }
150
+ }
151
+ /*********************************************************************/
152
+ /* 既存データの表示処理 */
153
+ /* IN: rec 社員番号が一致した時のレコード */
154
+ /*********************************************************************/
155
+ void data_disp(struct syain_k *rec) /*表示処理*/
156
+ {
157
+ int X;
158
+ X = atoi(rec->sno);
159
+ switch (X) {
160
+ case 0:
161
+ printf("役員\n");
162
+ break;
163
+ case 1:
164
+ printf("部長\n");
165
+ break;
166
+ case 2:
167
+ printf("課長\n");
168
+ break;
169
+ case 3:
170
+ printf("係長\n");
171
+ break;
172
+ case 4:
173
+ printf("主任\n");
174
+ break;
175
+ default:
176
+ printf(" \n");
177
+ }
178
+ printf("%s", rec->name);
179
+ printf("%s", rec->salary);
180
+ }
181
+ /*********************************************************************/
182
+ /* 登録処理 */
183
+ /* IN: recno・・・レコード番号 */
184
+ /* 0:更新レコードは存在しない */
185
+ /* 1~:更新するレコード番号 */
186
+ /* IN: *sno・・・社員番号 */
187
+ /* IN: *name・・・氏名 */
188
+ /* IN: *salary・・・給与 */
189
+ /*********************************************************************/
190
+ void touroku(int recno, char *sno, char *name, char *salary)
191
+ // char *sno, *name, *salary;
192
+ {
193
+ struct syain_k wtbuf;
194
+ memcpy(wtbuf.sno, sno, 5);
195
+ memcpy(wtbuf.name, name, 20);
196
+ memcpy(wtbuf.salary, salary, 7);
197
+ wtbuf.crlf[0] = CR;
198
+ wtbuf.crlf[1] = LF;
199
+ if (recno == 0)
200
+ lseek(Fd, 0L, SEEK_END);
201
+ else
202
+ lseek(Fd, 34 * (recno - 1), SEEK_SET);
203
+
204
+ write(Fd, &wtbuf, sizeof(wtbuf));
205
+ }
206
+ ```
207
+ こちらでコンパイラ通すため一部変えています(#include <io.h>のコメント化とか)。・・・エラーが出るので実行ファイルは出来ません^^;

4

追記

2019/04/24 03:15

投稿

cateye
cateye

スコア6851

answer CHANGED
@@ -5,4 +5,6 @@
5
5
  open()やscanf()などエラーチェックがないのは致命的。
6
6
  前回の質問でも言いましたが、新旧入り乱れたコーディングです。インデントもいい加減。気をつけましょう。
7
7
  ・・あと「このソースコンパイル通ってますか?」
8
- case0: printf("役員\n");はcase 0: printf("役員\n");ですね?(他のcaseも)
8
+ case0: printf("役員\n");はcase 0: printf("役員\n");ですね?(他のcaseも)
9
+ //
10
+ 全体的にエラーチェックが抜けています。特にファイル操作についてはディスクそのものを壊してしまう可能性も有るのですべてチェックするようにしましょう。

3

加筆

2019/04/24 02:31

投稿

cateye
cateye

スコア6851

answer CHANGED
@@ -4,5 +4,5 @@
4
4
  //
5
5
  open()やscanf()などエラーチェックがないのは致命的。
6
6
  前回の質問でも言いましたが、新旧入り乱れたコーディングです。インデントもいい加減。気をつけましょう。
7
- ・・あと
7
+ ・・あと「このソースコンパイル通ってますか?」
8
8
  case0: printf("役員\n");はcase 0: printf("役員\n");ですね?(他のcaseも)

2

追記

2019/04/24 01:58

投稿

cateye
cateye

スコア6851

answer CHANGED
@@ -3,4 +3,6 @@
3
3
  ・・・他にもありますmemcpy()とか・・・
4
4
  //
5
5
  open()やscanf()などエラーチェックがないのは致命的。
6
- 前回の質問でも言いましたが、新旧入り乱れたコーディングです。インデントもいい加減。気をつけましょう。
6
+ 前回の質問でも言いましたが、新旧入り乱れたコーディングです。インデントもいい加減。気をつけましょう。
7
+ ・・あと
8
+ case0: printf("役員\n");はcase 0: printf("役員\n");ですね?(他のcaseも)

1

加筆

2019/04/24 01:55

投稿

cateye
cateye

スコア6851

answer CHANGED
@@ -2,4 +2,5 @@
2
2
  int numeric_chk(char *str, int n)・・・文字列(\0終端)を渡しているのになぜサイズがいるんでしょう?・・・また、呼び出し元でマジックナンバー(7など)をハードコーディングしているのは?
3
3
  ・・・他にもありますmemcpy()とか・・・
4
4
  //
5
+ open()やscanf()などエラーチェックがないのは致命的。
5
6
  前回の質問でも言いましたが、新旧入り乱れたコーディングです。インデントもいい加減。気をつけましょう。