这两天复习RenMian给我留下谭浩强的C语言教程,温故而知新,夯实基础知识,把第十三章《文件》的书复习后把所有的编程习题做了一遍,贴出来激励自己一下,也希望有用的同学可以参考,时间和水平有限,不足之处,恳请读者批评指正
答案如下
inc/testfile.h:
view plaincopy to clipboardprint?
01./* inc/testfile.h */
02.
03.#include <stdio.h>
04.#include <memory.h>
05.
06.#define SIZE 3
07.
08.typedef enum tag_sex
09.{
10. MALE = 1,
11. FEMALE,
12.} E_SEX;
13.
14.typedef enum tag_health
15.{
16. GOOD = 1,
17. BAD,
18.} E_HEALTH;
19.
20.typedef enum tag_edu_bkgund
21.{
22. BACHELOR = 1,
23. MASTER,
24. DOCTOR,
25.} E_EDU_BAK_GUND;
26.
27.typedef struct tag_stud
28.{
29. char acName[30];
30. int score1;
31. int score2;
32. int score3;
33. int ave;
34.} STUD, *PSTUD;
35.
36.typedef struct tag_emploee
37.{
38. char m_name[30];
39. char m_addr[30];
40. int m_num;
41. int m_sex;
42. int m_health;
43. int m_edu_bakgund;
44.} ST_EMPLOYEE;
45.
46.int test_13_4()
47.{
48. FILE *fp = NULL;
49. char cTemp = 0, *fileName = "D:\\test_13_4.txt";
50.
51. if(( fp = fopen(fileName,"w") ) == NULL)
52. {
53. printf("Cannot Open File %s", fileName);
54. return -1;
55. }
56.
57. cTemp = getchar();
58.
59. while(cTemp != '!')
60. {
61. if(cTemp >= 'A' && cTemp <= 'Z')
62. {
63. cTemp = cTemp + ('a' - 'A');
64. }
65.
66. fputc(cTemp, fp);
67.
68. cTemp = getchar();
69. }
70.
71. fclose(fp);
72.
73. return 0;
74.}
75.
76.int test_13_5()
77.{
78. FILE *fpIn1 = NULL, *fpIn2 = NULL, *fpOut = NULL;
79. char cTemp = 0;
80. char *pcInFile1 = "D:\\a.txt", *pcInFile2 = "D:\\b.txt", *pcOutFile = "D:\\c.txt";
81.
82. if( (fpIn1 = fopen(pcInFile1,"r")) == NULL )
83. {
84. printf("Cannot Open File %s", pcInFile1);
85. return -1;
86. }
87.
88. if( (fpIn2 = fopen(pcInFile2,"r")) == NULL )
89. {
90. printf("Cannot Open File %s", pcInFile2);
91. return -1;
92. }
93.
94. if( (fpOut = fopen(pcOutFile,"w")) == NULL )
95. {
96. printf("Cannot Open File %s", pcInFile1);
97. return -1;
98. }
99.
100.
101. while( !feof(fpIn1) )
102. {
103. cTemp = fgetc(fpIn1);
104. fputc(cTemp, fpOut);
105. }
106.
107. while( !feof(fpIn2))
108. {
109. cTemp = fgetc(fpIn2);
110. fputc(cTemp, fpOut);
111. }
112.
113. fclose(fpIn1);
114. fclose(fpIn2);
115. fclose(fpOut);
116.
117.
118. return 0;
119.}
120.
121.int test_13_6()
122.{
123. int iIte = 0;
124. FILE *fp = NULL;
125. STUD astStud[SIZE] = {0}, astOut[SIZE] = {0};
126.
127.
128. /* write */
129. if( (fp = fopen("D:\\stud.dat", "wb+")) == NULL)
130. {
131. printf("Can not open stud.dat \r\n");
132. return -1;
133. }
134.
135. for(iIte = 0; iIte < SIZE; iIte++)
136. {
137. scanf("%s %d %d %d", astStud[iIte].acName, &astStud[iIte].score1, &astStud[iIte].score2, &astStud[iIte].score3);
138. }
139.
140.
141. for(iIte = 0; iIte < SIZE; iIte++)
142. {
143. astStud[iIte].ave += astStud[iIte].score1;
144. astStud[iIte].ave += astStud[iIte].score2;
145. astStud[iIte].ave += astStud[iIte].score3;
146.
147. astStud[iIte].ave /= 3;
148.
149. if((fwrite(&astStud[iIte], sizeof(STUD), 1, fp) != 1))
150. {
151. printf("File Write Error\r\n");
152. return -2;
153. }
154.
155. printf("Average1: %d\r\n", astStud[iIte].ave);
156.
157. }
158.
159. fclose(fp);
160.
161.
162. /* read */
163. if( (fp = fopen("D:\\stud.dat", "rb")) == NULL)
164. {
165. printf("Can not open stud.dat \r\n");
166. return -1;
167. }
168.
169. for(iIte = 0; iIte < SIZE; iIte++)
170. {
171. fread(&astOut[iIte], sizeof(STUD), 1, fp);
172. printf("%-10s %3d %3d %3d \r\n", astOut[iIte].acName, astOut[iIte].score1, astOut[iIte].score2, astOut[iIte].score3);
173. printf("Average: %3d \r\n", astStud[iIte].ave);
174. }
175.
176. fclose(fp);
177. return 0;
178.}
179.
180.int test_13_7()
181.{
182. int iIte = 0, iIte2 = 0;
183. FILE *fp = NULL;
184. STUD astStud[SIZE] = {0}, astOut[SIZE] = {0}, stTemp = {0};
185.
186. /* write */
187. if( (fp = fopen("D:\\stud.dat", "wb+")) == NULL)
188. {
189. printf("Can not open stud.dat \r\n");
190. return -1;
191. }
192.
193. for(iIte = 0; iIte < SIZE; iIte++)
194. {
195. scanf("%s %d %d %d", astStud[iIte].acName, &astStud[iIte].score1, &astStud[iIte].score2, &astStud[iIte].score3);
196.
197. astStud[iIte].ave += astStud[iIte].score1;
198. astStud[iIte].ave += astStud[iIte].score2;
199. astStud[iIte].ave += astStud[iIte].score3;
200.
201. astStud[iIte].ave /= 3;
202.
203. }
204.
205. /* Sort */
206. for(iIte = 0; iIte < SIZE; iIte++)
207. {
208. for(iIte2 = 0; iIte2 < SIZE - iIte; iIte2++)
209. {
210. if( astStud[iIte2].ave < astStud[iIte2 + 1].ave )
211. {
212. stTemp = astStud[iIte2];
213. astStud[iIte2] = astStud[iIte2 + 1];
214. astStud[iIte2 + 1] = stTemp;
215. }
216.
217. }
218. }
219.
220.
221. for(iIte = 0; iIte < SIZE; iIte++)
222. {
223.
224. if((fwrite(&astStud[iIte], sizeof(STUD), 1, fp) != 1))
225. {
226. printf("File Write Error\r\n");
227. return -2;
228. }
229.
230. printf("Average1: %d\r\n", astStud[iIte].ave);
231.
232. }
233.
234. fclose(fp);
235.
236.
237. /* read */
238. if( (fp = fopen("D:\\stud.dat", "rb")) == NULL)
239. {
240. printf("Can not open stud.dat \r\n");
241. return -1;
242. }
243.
244. for(iIte = 0; iIte < SIZE; iIte++)
245. {
246. fread(&astOut[iIte], sizeof(STUD), 1, fp);
247. printf("%-10s %3d %3d %3d \r\n", astOut[iIte].acName, astOut[iIte].score1, astOut[iIte].score2, astOut[iIte].score3);
248. printf("Average: %3d \r\n", astStud[iIte].ave);
249. }
250.
251. fclose(fp);
252. return 0;
253.}
254.
255.int test_13_8()
256.{
257. int iIte = 0, iIte2 = 0, iPos = 0;
258. FILE *fp = NULL;
259. STUD astStud[SIZE] = {0}, astOut[SIZE + 1] = {0}, astTemp[SIZE] = {0}, stTemp = {0}, stInsert = {0};
260.
261.
262. if( (fp = fopen("D:\\stud.dat", "wb+")) == NULL)
263. {
264. printf("Can not open stud.dat \r\n");
265. return -1;
266. }
267.
268. for(iIte = 0; iIte < SIZE; iIte++)
269. {
270. scanf("%s %d %d %d", astStud[iIte].acName, &astStud[iIte].score1, &astStud[iIte].score2, &astStud[iIte].score3);
271.
272. astStud[iIte].ave += astStud[iIte].score1;
273. astStud[iIte].ave += astStud[iIte].score2;
274. astStud[iIte].ave += astStud[iIte].score3;
275.
276. astStud[iIte].ave /= 3;
277.
278. }
279.
280. /* Sort */
281. for(iIte = 0; iIte < SIZE; iIte++)
282. {
283. for(iIte2 = 0; iIte2 < SIZE - iIte; iIte2++)
284. {
285. if( astStud[iIte2].ave < astStud[iIte2 + 1].ave )
286. {
287. stTemp = astStud[iIte2];
288. astStud[iIte2] = astStud[iIte2 + 1];
289. astStud[iIte2 + 1] = stTemp;
290. }
291.
292. }
293. }
294.
295. /* write */
296. for(iIte = 0; iIte < SIZE; iIte++)
297. {
298.
299. if((fwrite(&astStud[iIte], sizeof(STUD), 1, fp) != 1))
300. {
301. printf("File Write Error\r\n");
302. return -2;
303. }
304.
305. }
306.
307. fclose(fp);
308.
309. printf("Please Enter Insert Student Data: ");
310. scanf("%s %d %d %d", stInsert.acName, &stInsert.score1, &stInsert.score2, &stInsert.score3);
311. stInsert.ave += stInsert.score1;
312. stInsert.ave += stInsert.score2;
313. stInsert.ave += stInsert.score3;
314. stInsert.ave /= 3;
315.
316. /* read */
317. if( (fp = fopen("D:\\stud.dat", "rb")) == NULL)
318. {
319. printf("Can not open stud.dat \r\n");
320. return -1;
321. }
322.
323. /* insert */
324. for(iIte = 0; iIte < SIZE; iIte++)
325. {
326. fread(&stTemp, sizeof(STUD), 1, fp);
327.
328. if(stTemp.ave <= stInsert.ave)
329. {
330. break;
331. }
332.
333. iPos++;
334.
335. }
336.
337. fseek(fp, iPos * sizeof(STUD), SEEK_SET);
338. for(iIte = 0; iIte < SIZE - iPos; iIte++)
339. {
340. fread(&astTemp[iIte], sizeof(STUD), 1, fp);
341. }
342.
343. fclose(fp);
344.
345.
346. /** 注意这里必须使用"rb+"的方式使能读写功能,不能使用"wb"或者"ab",
347. * 因为fseek只有在"rb+"的模式下才可以对文件进行"查找+读写"
348. */
349. if( (fp = fopen("D:\\stud.dat", "rb+")) == NULL)
350. {
351. printf("Can not open stud.dat \r\n");
352. return -1;
353. }
354.
355. fseek(fp, iPos * sizeof(STUD), SEEK_SET);
356. fwrite(&stInsert, sizeof(STUD), 1, fp);
357.
358. for(iIte = 0; iIte < SIZE - iPos; iIte++)
359. {
360. fwrite(&astTemp[iIte], sizeof(STUD), 1, fp);
361. }
362.
363. fclose(fp);
364.
365. /* read */
366. if( (fp = fopen("D:\\stud.dat", "rb")) == NULL)
367. {
368. printf("Can not open stud.dat \r\n");
369. return -1;
370. }
371.
372. for(iIte = 0; iIte < SIZE + 1; iIte++)
373. {
374. fread(&astOut[iIte], sizeof(STUD), 1, fp);
375. printf("%-10s %3d %3d %3d \r\n", astOut[iIte].acName, astOut[iIte].score1, astOut[iIte].score2, astOut[iIte].score3);
376. printf("Average: %3d \r\n", astOut[iIte].ave);
377. }
378.
379. return 0;
380.}
381.
382.int test_13_9()
383.{
384. int iIte = 0, iIte2 = 0, iPos = 0;
385. FILE *fp = NULL;
386. STUD astStud[SIZE] = {0}, astOut[SIZE + 1] = {0}, astTemp[SIZE] = {0}, stTemp = {0}, stInsert = {0};
387.
388.
389. if( (fp = fopen("D:\\stud.dat", "wb+")) == NULL)
390. {
391. printf("Can not open stud.dat \r\n");
392. return -1;
393. }
394.
395. for(iIte = 0; iIte < SIZE; iIte++)
396. {
397. scanf("%s %d %d %d", astStud[iIte].acName, &astStud[iIte].score1, &astStud[iIte].score2, &astStud[iIte].score3);
398.
399. astStud[iIte].ave += astStud[iIte].score1;
400. astStud[iIte].ave += astStud[iIte].score2;
401. astStud[iIte].ave += astStud[iIte].score3;
402.
403. astStud[iIte].ave /= 3;
404.
405. }
406.
407. /* Sort */
408. for(iIte = 0; iIte < SIZE; iIte++)
409. {
410. for(iIte2 = 0; iIte2 < SIZE - iIte; iIte2++)
411. {
412. if( astStud[iIte2].ave < astStud[iIte2 + 1].ave )
413. {
414. stTemp = astStud[iIte2];
415. astStud[iIte2] = astStud[iIte2 + 1];
416. astStud[iIte2 + 1] = stTemp;
417. }
418.
419. }
420. }
421.
422. /* write */
423. for(iIte = 0; iIte < SIZE; iIte++)
424. {
425.
426. if((fwrite(&astStud[iIte], sizeof(STUD), 1, fp) != 1))
427. {
428. printf("File Write Error\r\n");
429. return -2;
430. }
431.
432. }
433.
434. fclose(fp);
435.
436. printf("Please Enter Insert Student Data: ");
437. scanf("%s %d %d %d", stInsert.acName, &stInsert.score1, &stInsert.score2, &stInsert.score3);
438. stInsert.ave += stInsert.score1;
439. stInsert.ave += stInsert.score2;
440. stInsert.ave += stInsert.score3;
441. stInsert.ave /= 3;
442.
443. /* read */
444. if( (fp = fopen("D:\\stud.dat", "rb")) == NULL)
445. {
446. printf("Can not open stud.dat \r\n");
447. return -1;
448. }
449.
450. /* insert */
451. for(iIte = 0; iIte < SIZE; iIte++)
452. {
453. fread(&stTemp, sizeof(STUD), 1, fp);
454.
455. if(stTemp.ave <= stInsert.ave)
456. {
457. break;
458. }
459.
460. iPos++;
461.
462. }
463.
464. fseek(fp, iPos * sizeof(STUD), SEEK_SET);
465. for(iIte = 0; iIte < SIZE - iPos; iIte++)
466. {
467. fread(&astTemp[iIte], sizeof(STUD), 1, fp);
468. }
469.
470. fclose(fp);
471.
472.
473. /** 注意这里必须使用"rb+"的方式使能读写功能,不能使用"wb"或者"ab",
474. * 因为fseek只有在"rb+"的模式下才可以对文件进行"查找+读写"
475. */
476. if( (fp = fopen("D:\\stud.dat", "rb+")) == NULL)
477. {
478. printf("Can not open stud.dat \r\n");
479. return -1;
480. }
481.
482. fseek(fp, iPos * sizeof(STUD), SEEK_SET);
483. fwrite(&stInsert, sizeof(STUD), 1, fp);
484.
485. for(iIte = 0; iIte < SIZE - iPos; iIte++)
486. {
487. fwrite(&astTemp[iIte], sizeof(STUD), 1, fp);
488. }
489.
490. fclose(fp);
491.
492. /* read */
493. if( (fp = fopen("D:\\stud.dat", "rb")) == NULL)
494. {
495. printf("Can not open stud.dat \r\n");
496. return -1;
497. }
498.
499. for(iIte = 0; iIte < SIZE + 1; iIte++)
500. {
501. fread(&astOut[iIte], sizeof(STUD), 1, fp);
502. printf("%-10s %3d %3d %3d \r\n", astOut[iIte].acName, astOut[iIte].score1, astOut[iIte].score2, astOut[iIte].score3);
503. printf("Average: %3d \r\n", astOut[iIte].ave);
504. }
505.
506. return 0;
507.}
508.
509.int test_13_10()
510.{
511. int iIte = 0;
512. FILE *fp = NULL;
513. ST_EMPLOYEE astEmp[SIZE] = {0}, astOut[SIZE] = {0};
514.
515.
516. if( (fp = fopen("D:\\employee.dat", "wb+")) == NULL)
517. {
518. printf("Can not open stud.dat \r\n");
519. return -1;
520. }
521.
522. for(iIte = 0; iIte < SIZE; iIte++)
523. {
524. scanf("%d %s %s %d %d %d", &astEmp[iIte].m_num, astEmp[iIte].m_name, astEmp[iIte].m_addr, &astEmp[iIte].m_sex, &astEmp[iIte].m_health, &astEmp[iIte].m_edu_bakgund);
525. }
526.
527.
528. /* write */
529. for(iIte = 0; iIte < SIZE; iIte++)
530. {
531.
532. if(fwrite(&astEmp[iIte], sizeof(ST_EMPLOYEE), 1, fp) != 1)
533. {
534. printf("File Write Error \r\n");
535. return -2;
536. }
537. }
538.
539. fclose(fp);
540.
541. /* read */
542. if( (fp = fopen("D:\\employee.dat", "rb")) == NULL)
543. {
544. printf("Can not open stud.dat \r\n");
545. return -1;
546. }
547.
548. for(iIte = 0; iIte < SIZE; iIte++)
549. {
550. fread(&astOut[iIte], sizeof(ST_EMPLOYEE), 1, fp);
551. printf("%3d %-10s %-10s %3d %3d %3d \r\n", astOut[iIte].m_num, astOut[iIte].m_name, astOut[iIte].m_addr, astOut[iIte].m_sex, astOut[iIte].m_health, astOut[iIte].m_edu_bakgund);
552. }
553.
554. return 0;
555.}
556.
557.int test_13_11()
558.{
559. int iIte = 0, iNum = 0, iPos = 0;
560. FILE *fp = NULL;
561. ST_EMPLOYEE astEmp[SIZE] = {0}, astTemp[SIZE] = {0}, astOut[SIZE] = {0}, stTemp = {0};
562.
563.
564. if( (fp = fopen("D:\\employee.dat", "wb+")) == NULL)
565. {
566. printf("Can not open stud.dat \r\n");
567. return -1;
568. }
569.
570. for(iIte = 0; iIte < SIZE; iIte++)
571. {
572. scanf("%d %s %s %d %d %d", &astEmp[iIte].m_num, astEmp[iIte].m_name, astEmp[iIte].m_addr, &astEmp[iIte].m_sex, &astEmp[iIte].m_health, &astEmp[iIte].m_edu_bakgund);
573. }
574.
575.
576. /* write */
577. for(iIte = 0; iIte < SIZE; iIte++)
578. {
579.
580. if(fwrite(&astEmp[iIte], sizeof(ST_EMPLOYEE), 1, fp) != 1)
581. {
582. printf("File Write Error \r\n");
583. return -2;
584. }
585. }
586.
587. fclose(fp);
588.
589.#if 1
590. printf("Please Enter Delete Employee Number: ");
591. scanf("%d", &iNum);
592.
593. /* read */
594. if( (fp = fopen("D:\\employee.dat", "rb")) == NULL)
595. {
596. printf("Can not open stud.dat \r\n");
597. return -1;
598. }
599.
600. /* find */
601. for(iIte = 0, iPos = 0; iIte < SIZE; iIte++)
602. {
603. fread(&stTemp, sizeof(ST_EMPLOYEE), 1, fp);
604.
605. if(stTemp.m_num == iNum)
606. {
607. continue;
608. }
609.
610. astTemp[iPos++] = stTemp;
611.
612. }
613.
614. if(iPos == SIZE)
615. {
616. printf("Can not find this employee");
617. return -3;
618. }
619.
620. fclose(fp);
621.
622. /* Delete */
623. /** 注意这里必须使用"rb+"的方式使能读写功能,不能使用"wb"或者"ab",
624. * 因为fseek只有在"rb+"的模式下才可以对文件进行"查找+读写"
625. */
626. if( (fp = fopen("D:\\employee.dat", "wb")) == NULL)
627. {
628. printf("Can not open stud.dat \r\n");
629. return -1;
630. }
631.
632. for(iIte = 0; iIte < (sizeof(astTemp) / sizeof(ST_EMPLOYEE)); iIte++)
633. {
634. fwrite(&astTemp[iIte], sizeof(ST_EMPLOYEE), 1, fp);
635. }
636.
637. fclose(fp);
638.#endif
639.
640. /* read */
641. if( (fp = fopen("D:\\employee.dat", "rb")) == NULL)
642. {
643. printf("Can not open stud.dat \r\n");
644. return -1;
645. }
646.
647. for(iIte = 0; iIte < SIZE - 1; iIte++)
648. {
649. fread(&astOut[iIte], sizeof(ST_EMPLOYEE), 1, fp);
650. printf("%3d %-10s %-10s %3d %3d %3d \r\n", astOut[iIte].m_num, astOut[iIte].m_name, astOut[iIte].m_addr, astOut[iIte].m_sex, astOut[iIte].m_health, astOut[iIte].m_edu_bakgund);
651. }
652.
653. return 0;
654.}
655.
656.int test_13_12()
657.{
658. FILE *fp = NULL;
659. char cTemp = 0, *fileName = "D:\\test_13_12.txt", *endStr = "END", *pStr = NULL, line[BUFSIZE] = {0};
660.
661. if(( fp = fopen(fileName,"w") ) == NULL)
662. {
663. printf("Cannot Open File %s", fileName);
664. return -1;
665. }
666.
667. /** 使用fgets来进行行读入,而不适用scanf,可以保留line中的“回车”和“空格”
668. * 使用第一个字符为特殊字符或者遇到读入文件尾部来作为while的终止
669. */
670. while( fgets(line, BUFSIZ, stdin) != NULL
671. && line[0] != '$')
672. {
673. /* lower*/
674. pStr = line;
675. while(*pStr != '\0')
676. {
677. printf("STEP 3\r\n");
678. if(*pStr >= 'A' && *pStr <= 'Z')
679. {
680. *pStr += ('a' - 'A');
681. }
682.
683. ++pStr;
684. }
685.
686. /* write */
687. fputs(line, fp);
688. }
689.
690. fclose(fp);
691.
692. return 0;
693.}
694.
695.int testFile()
696.{
697. int iRet = 0;
698.
699.#if 0
700. iRet += test_13_4();
701.
702. iRet += test_13_5();
703.
704. iRet += test_13_6();
705.
706. iRet += test_13_7();
707.
708. iRet += test_13_8();
709.
710. iRet += test_13_9();
711.
712. iRet += test_13_10();
713.
714. iRet += test_13_11();
715.
716.#endif
717.
718. iRet += test_13_12();
719.
720. return iRet;
721.
722.}
/* inc/testfile.h */
#include <stdio.h>
#include <memory.h>
#define SIZE 3
typedef enum tag_sex
{
MALE = 1,
FEMALE,
} E_SEX;
typedef enum tag_health
{
GOOD = 1,
BAD,
} E_HEALTH;
typedef enum tag_edu_bkgund
{
BACHELOR = 1,
MASTER,
DOCTOR,
} E_EDU_BAK_GUND;
typedef struct tag_stud
{
char acName[30];
int score1;
int score2;
int score3;
int ave;
} STUD, *PSTUD;
typedef struct tag_emploee
{
char m_name[30];
char m_addr[30];
int m_num;
int m_sex;
int m_health;
int m_edu_bakgund;
} ST_EMPLOYEE;
int test_13_4()
{
FILE *fp = NULL;
char cTemp = 0, *fileName = "D:\\test_13_4.txt";
if(( fp = fopen(fileName,"w") ) == NULL)
{
printf("Cannot Open File %s", fileName);
return -1;
}
cTemp = getchar();
while(cTemp != '!')
{
if(cTemp >= 'A' && cTemp <= 'Z')
{
cTemp = cTemp + ('a' - 'A');
}
fputc(cTemp, fp);
cTemp = getchar();
}
fclose(fp);
return 0;
}
int test_13_5()
{
FILE *fpIn1 = NULL, *fpIn2 = NULL, *fpOut = NULL;
char cTemp = 0;
char *pcInFile1 = "D:\\a.txt", *pcInFile2 = "D:\\b.txt", *pcOutFile = "D:\\c.txt";
if( (fpIn1 = fopen(pcInFile1,"r")) == NULL )
{
printf("Cannot Open File %s", pcInFile1);
return -1;
}
if( (fpIn2 = fopen(pcInFile2,"r")) == NULL )
{
printf("Cannot Open File %s", pcInFile2);
return -1;
}
if( (fpOut = fopen(pcOutFile,"w")) == NULL )
{
printf("Cannot Open File %s", pcInFile1);
return -1;
}
while( !feof(fpIn1) )
{
cTemp = fgetc(fpIn1);
fputc(cTemp, fpOut);
}
while( !feof(fpIn2))
{
cTemp = fgetc(fpIn2);
fputc(cTemp, fpOut);
}
fclose(fpIn1);
fclose(fpIn2);
fclose(fpOut);
return 0;
}
int test_13_6()
{
int iIte = 0;
FILE *fp = NULL;
STUD astStud[SIZE] = {0}, astOut[SIZE] = {0};
/* write */
if( (fp = fopen("D:\\stud.dat", "wb+")) == NULL)
{
printf("Can not open stud.dat \r\n");
return -1;
}
for(iIte = 0; iIte < SIZE; iIte++)
{
scanf("%s %d %d %d", astStud[iIte].acName, &astStud[iIte].score1, &astStud[iIte].score2, &astStud[iIte].score3);
}
for(iIte = 0; iIte < SIZE; iIte++)
{
astStud[iIte].ave += astStud[iIte].score1;
astStud[iIte].ave += astStud[iIte].score2;
astStud[iIte].ave += astStud[iIte].score3;
astStud[iIte].ave /= 3;
if((fwrite(&astStud[iIte], sizeof(STUD), 1, fp) != 1))
{
printf("File Write Error\r\n");
return -2;
}
printf("Average1: %d\r\n", astStud[iIte].ave);
}
fclose(fp);
/* read */
if( (fp = fopen("D:\\stud.dat", "rb")) == NULL)
{
printf("Can not open stud.dat \r\n");
return -1;
}
for(iIte = 0; iIte < SIZE; iIte++)
{
fread(&astOut[iIte], sizeof(STUD), 1, fp);
printf("%-10s %3d %3d %3d \r\n", astOut[iIte].acName, astOut[iIte].score1, astOut[iIte].score2, astOut[iIte].score3);
printf("Average: %3d \r\n", astStud[iIte].ave);
}
fclose(fp);
return 0;
}
int test_13_7()
{
int iIte = 0, iIte2 = 0;
FILE *fp = NULL;
STUD astStud[SIZE] = {0}, astOut[SIZE] = {0}, stTemp = {0};
/* write */
if( (fp = fopen("D:\\stud.dat", "wb+")) == NULL)
{
printf("Can not open stud.dat \r\n");
return -1;
}
for(iIte = 0; iIte < SIZE; iIte++)
{
scanf("%s %d %d %d", astStud[iIte].acName, &astStud[iIte].score1, &astStud[iIte].score2, &astStud[iIte].score3);
astStud[iIte].ave += astStud[iIte].score1;
astStud[iIte].ave += astStud[iIte].score2;
astStud[iIte].ave += astStud[iIte].score3;
astStud[iIte].ave /= 3;
}
/* Sort */
for(iIte = 0; iIte < SIZE; iIte++)
{
for(iIte2 = 0; iIte2 < SIZE - iIte; iIte2++)
{
if( astStud[iIte2].ave < astStud[iIte2 + 1].ave )
{
stTemp = astStud[iIte2];
astStud[iIte2] = astStud[iIte2 + 1];
astStud[iIte2 + 1] = stTemp;
}
}
}
for(iIte = 0; iIte < SIZE; iIte++)
{
if((fwrite(&astStud[iIte], sizeof(STUD), 1, fp) != 1))
{
printf("File Write Error\r\n");
return -2;
}
printf("Average1: %d\r\n", astStud[iIte].ave);
}
fclose(fp);
/* read */
if( (fp = fopen("D:\\stud.dat", "rb")) == NULL)
{
printf("Can not open stud.dat \r\n");
return -1;
}
for(iIte = 0; iIte < SIZE; iIte++)
{
fread(&astOut[iIte], sizeof(STUD), 1, fp);
printf("%-10s %3d %3d %3d \r\n", astOut[iIte].acName, astOut[iIte].score1, astOut[iIte].score2, astOut[iIte].score3);
printf("Average: %3d \r\n", astStud[iIte].ave);
}
fclose(fp);
return 0;
}
int test_13_8()
{
int iIte = 0, iIte2 = 0, iPos = 0;
FILE *fp = NULL;
STUD astStud[SIZE] = {0}, astOut[SIZE + 1] = {0}, astTemp[SIZE] = {0}, stTemp = {0}, stInsert = {0};
if( (fp = fopen("D:\\stud.dat", "wb+")) == NULL)
{
printf("Can not open stud.dat \r\n");
return -1;
}
for(iIte = 0; iIte < SIZE; iIte++)
{
scanf("%s %d %d %d", astStud[iIte].acName, &astStud[iIte].score1, &astStud[iIte].score2, &astStud[iIte].score3);
astStud[iIte].ave += astStud[iIte].score1;
astStud[iIte].ave += astStud[iIte].score2;
astStud[iIte].ave += astStud[iIte].score3;
astStud[iIte].ave /= 3;
}
/* Sort */
for(iIte = 0; iIte < SIZE; iIte++)
{
for(iIte2 = 0; iIte2 < SIZE - iIte; iIte2++)
{
if( astStud[iIte2].ave < astStud[iIte2 + 1].ave )
{
stTemp = astStud[iIte2];
astStud[iIte2] = astStud[iIte2 + 1];
astStud[iIte2 + 1] = stTemp;
}
}
}
/* write */
for(iIte = 0; iIte < SIZE; iIte++)
{
if((fwrite(&astStud[iIte], sizeof(STUD), 1, fp) != 1))
{
printf("File Write Error\r\n");
return -2;
}
}
fclose(fp);
printf("Please Enter Insert Student Data: ");
scanf("%s %d %d %d", stInsert.acName, &stInsert.score1, &stInsert.score2, &stInsert.score3);
stInsert.ave += stInsert.score1;
stInsert.ave += stInsert.score2;
stInsert.ave += stInsert.score3;
stInsert.ave /= 3;
/* read */
if( (fp = fopen("D:\\stud.dat", "rb")) == NULL)
{
printf("Can not open stud.dat \r\n");
return -1;
}
/* insert */
for(iIte = 0; iIte < SIZE; iIte++)
{
fread(&stTemp, sizeof(STUD), 1, fp);
if(stTemp.ave <= stInsert.ave)
{
break;
}
iPos++;
}
fseek(fp, iPos * sizeof(STUD), SEEK_SET);
for(iIte = 0; iIte < SIZE - iPos; iIte++)
{
fread(&astTemp[iIte], sizeof(STUD), 1, fp);
}
fclose(fp);
/** 注意这里必须使用"rb+"的方式使能读写功能,不能使用"wb"或者"ab",
* 因为fseek只有在"rb+"的模式下才可以对文件进行"查找+读写"
*/
if( (fp = fopen("D:\\stud.dat", "rb+")) == NULL)
{
printf("Can not open stud.dat \r\n");
return -1;
}
fseek(fp, iPos * sizeof(STUD), SEEK_SET);
fwrite(&stInsert, sizeof(STUD), 1, fp);
for(iIte = 0; iIte < SIZE - iPos; iIte++)
{
fwrite(&astTemp[iIte], sizeof(STUD), 1, fp);
}
fclose(fp);
/* read */
if( (fp = fopen("D:\\stud.dat", "rb")) == NULL)
{
printf("Can not open stud.dat \r\n");
return -1;
}
for(iIte = 0; iIte < SIZE + 1; iIte++)
{
fread(&astOut[iIte], sizeof(STUD), 1, fp);
printf("%-10s %3d %3d %3d \r\n", astOut[iIte].acName, astOut[iIte].score1, astOut[iIte].score2, astOut[iIte].score3);
printf("Average: %3d \r\n", astOut[iIte].ave);
}
return 0;
}
int test_13_9()
{
int iIte = 0, iIte2 = 0, iPos = 0;
FILE *fp = NULL;
STUD astStud[SIZE] = {0}, astOut[SIZE + 1] = {0}, astTemp[SIZE] = {0}, stTemp = {0}, stInsert = {0};
if( (fp = fopen("D:\\stud.dat", "wb+")) == NULL)
{
printf("Can not open stud.dat \r\n");
return -1;
}
for(iIte = 0; iIte < SIZE; iIte++)
{
scanf("%s %d %d %d", astStud[iIte].acName, &astStud[iIte].score1, &astStud[iIte].score2, &astStud[iIte].score3);
astStud[iIte].ave += astStud[iIte].score1;
astStud[iIte].ave += astStud[iIte].score2;
astStud[iIte].ave += astStud[iIte].score3;
astStud[iIte].ave /= 3;
}
/* Sort */
for(iIte = 0; iIte < SIZE; iIte++)
{
for(iIte2 = 0; iIte2 < SIZE - iIte; iIte2++)
{
if( astStud[iIte2].ave < astStud[iIte2 + 1].ave )
{
stTemp = astStud[iIte2];
astStud[iIte2] = astStud[iIte2 + 1];
astStud[iIte2 + 1] = stTemp;
}
}
}
/* write */
for(iIte = 0; iIte < SIZE; iIte++)
{
if((fwrite(&astStud[iIte], sizeof(STUD), 1, fp) != 1))
{
printf("File Write Error\r\n");
return -2;
}
}
fclose(fp);
printf("Please Enter Insert Student Data: ");
scanf("%s %d %d %d", stInsert.acName, &stInsert.score1, &stInsert.score2, &stInsert.score3);
stInsert.ave += stInsert.score1;
stInsert.ave += stInsert.score2;
stInsert.ave += stInsert.score3;
stInsert.ave /= 3;
/* read */
if( (fp = fopen("D:\\stud.dat", "rb")) == NULL)
{
printf("Can not open stud.dat \r\n");
return -1;
}
/* insert */
for(iIte = 0; iIte < SIZE; iIte++)
{
fread(&stTemp, sizeof(STUD), 1, fp);
if(stTemp.ave <= stInsert.ave)
{
break;
}
iPos++;
}
fseek(fp, iPos * sizeof(STUD), SEEK_SET);
for(iIte = 0; iIte < SIZE - iPos; iIte++)
{
fread(&astTemp[iIte], sizeof(STUD), 1, fp);
}
fclose(fp);
/** 注意这里必须使用"rb+"的方式使能读写功能,不能使用"wb"或者"ab",
* 因为fseek只有在"rb+"的模式下才可以对文件进行"查找+读写"
*/
if( (fp = fopen("D:\\stud.dat", "rb+")) == NULL)
{
printf("Can not open stud.dat \r\n");
return -1;
}
fseek(fp, iPos * sizeof(STUD), SEEK_SET);
fwrite(&stInsert, sizeof(STUD), 1, fp);
for(iIte = 0; iIte < SIZE - iPos; iIte++)
{
fwrite(&astTemp[iIte], sizeof(STUD), 1, fp);
}
fclose(fp);
/* read */
if( (fp = fopen("D:\\stud.dat", "rb")) == NULL)
{
printf("Can not open stud.dat \r\n");
return -1;
}
for(iIte = 0; iIte < SIZE + 1; iIte++)
{
fread(&astOut[iIte], sizeof(STUD), 1, fp);
printf("%-10s %3d %3d %3d \r\n", astOut[iIte].acName, astOut[iIte].score1, astOut[iIte].score2, astOut[iIte].score3);
printf("Average: %3d \r\n", astOut[iIte].ave);
}
return 0;
}
int test_13_10()
{
int iIte = 0;
FILE *fp = NULL;
ST_EMPLOYEE astEmp[SIZE] = {0}, astOut[SIZE] = {0};
if( (fp = fopen("D:\\employee.dat", "wb+")) == NULL)
{
printf("Can not open stud.dat \r\n");
return -1;
}
for(iIte = 0; iIte < SIZE; iIte++)
{
scanf("%d %s %s %d %d %d", &astEmp[iIte].m_num, astEmp[iIte].m_name, astEmp[iIte].m_addr, &astEmp[iIte].m_sex, &astEmp[iIte].m_health, &astEmp[iIte].m_edu_bakgund);
}
/* write */
for(iIte = 0; iIte < SIZE; iIte++)
{
if(fwrite(&astEmp[iIte], sizeof(ST_EMPLOYEE), 1, fp) != 1)
{
printf("File Write Error \r\n");
return -2;
}
}
fclose(fp);
/* read */
if( (fp = fopen("D:\\employee.dat", "rb")) == NULL)
{
printf("Can not open stud.dat \r\n");
return -1;
}
for(iIte = 0; iIte < SIZE; iIte++)
{
fread(&astOut[iIte], sizeof(ST_EMPLOYEE), 1, fp);
printf("%3d %-10s %-10s %3d %3d %3d \r\n", astOut[iIte].m_num, astOut[iIte].m_name, astOut[iIte].m_addr, astOut[iIte].m_sex, astOut[iIte].m_health, astOut[iIte].m_edu_bakgund);
}
return 0;
}
int test_13_11()
{
int iIte = 0, iNum = 0, iPos = 0;
FILE *fp = NULL;
ST_EMPLOYEE astEmp[SIZE] = {0}, astTemp[SIZE] = {0}, astOut[SIZE] = {0}, stTemp = {0};
if( (fp = fopen("D:\\employee.dat", "wb+")) == NULL)
{
printf("Can not open stud.dat \r\n");
return -1;
}
for(iIte = 0; iIte < SIZE; iIte++)
{
scanf("%d %s %s %d %d %d", &astEmp[iIte].m_num, astEmp[iIte].m_name, astEmp[iIte].m_addr, &astEmp[iIte].m_sex, &astEmp[iIte].m_health, &astEmp[iIte].m_edu_bakgund);
}
/* write */
for(iIte = 0; iIte < SIZE; iIte++)
{
if(fwrite(&astEmp[iIte], sizeof(ST_EMPLOYEE), 1, fp) != 1)
{
printf("File Write Error \r\n");
return -2;
}
}
fclose(fp);
#if 1
printf("Please Enter Delete Employee Number: ");
scanf("%d", &iNum);
/* read */
if( (fp = fopen("D:\\employee.dat", "rb")) == NULL)
{
printf("Can not open stud.dat \r\n");
return -1;
}
/* find */
for(iIte = 0, iPos = 0; iIte < SIZE; iIte++)
{
fread(&stTemp, sizeof(ST_EMPLOYEE), 1, fp);
if(stTemp.m_num == iNum)
{
continue;
}
astTemp[iPos++] = stTemp;
}
if(iPos == SIZE)
{
printf("Can not find this employee");
return -3;
}
fclose(fp);
/* Delete */
/** 注意这里必须使用"rb+"的方式使能读写功能,不能使用"wb"或者"ab",
* 因为fseek只有在"rb+"的模式下才可以对文件进行"查找+读写"
*/
if( (fp = fopen("D:\\employee.dat", "wb")) == NULL)
{
printf("Can not open stud.dat \r\n");
return -1;
}
for(iIte = 0; iIte < (sizeof(astTemp) / sizeof(ST_EMPLOYEE)); iIte++)
{
fwrite(&astTemp[iIte], sizeof(ST_EMPLOYEE), 1, fp);
}
fclose(fp);
#endif
/* read */
if( (fp = fopen("D:\\employee.dat", "rb")) == NULL)
{
printf("Can not open stud.dat \r\n");
return -1;
}
for(iIte = 0; iIte < SIZE - 1; iIte++)
{
fread(&astOut[iIte], sizeof(ST_EMPLOYEE), 1, fp);
printf("%3d %-10s %-10s %3d %3d %3d \r\n", astOut[iIte].m_num, astOut[iIte].m_name, astOut[iIte].m_addr, astOut[iIte].m_sex, astOut[iIte].m_health, astOut[iIte].m_edu_bakgund);
}
return 0;
}
int test_13_12()
{
FILE *fp = NULL;
char cTemp = 0, *fileName = "D:\\test_13_12.txt", *endStr = "END", *pStr = NULL, line[BUFSIZE] = {0};
if(( fp = fopen(fileName,"w") ) == NULL)
{
printf("Cannot Open File %s", fileName);
return -1;
}
/** 使用fgets来进行行读入,而不适用scanf,可以保留line中的“回车”和“空格”
* 使用第一个字符为特殊字符或者遇到读入文件尾部来作为while的终止
*/
while( fgets(line, BUFSIZ, stdin) != NULL
&& line[0] != '$')
{
/* lower*/
pStr = line;
while(*pStr != '\0')
{
printf("STEP 3\r\n");
if(*pStr >= 'A' && *pStr <= 'Z')
{
*pStr += ('a' - 'A');
}
++pStr;
}
/* write */
fputs(line, fp);
}
fclose(fp);
return 0;
}
int testFile()
{
int iRet = 0;
#if 0
iRet += test_13_4();
iRet += test_13_5();
iRet += test_13_6();
iRet += test_13_7();
iRet += test_13_8();
iRet += test_13_9();
iRet += test_13_10();
iRet += test_13_11();
#endif
iRet += test_13_12();
return iRet;
}
src/mian.c:
view plaincopy to clipboardprint?
01.#include <stdio.h>
02.#include <stdlib.h>
03.#include <assert.h>
04.
05.#include "../inc/testFile.h"
06.
07.int main()
08.{
09. int iRet = 0;
10.
11. iRet = testFile();
12. assert(iRet == 0);
13.
14. printf("Hello world!\n");
15. return 0;
16.}
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "../inc/testFile.h"
int main()
{
int iRet = 0;
iRet = testFile();
assert(iRet == 0);
printf("Hello world!\n");
return 0;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/asiainfolf/archive/2011/03/14/6248170.aspx