【原创】第十三章《文件》程序题目答案 -- 谭浩强C语言

这两天复习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

posted on 2011-03-14 14:23  sohu2000000  阅读(361)  评论(0编辑  收藏  举报

导航