1. 程式人生 > >C語言檔案程式設計題目

C語言檔案程式設計題目

題目要求:讀取檔案file1.txt的內容:
12
34
56
輸出到檔案file2.txt:
56
34
12
解決思路
(1)首先把檔案1中的資料獲取到並存儲起來;
(2)把資料顯示到檔案2中。
按照該思路,編寫程式碼如下:

#include<stdio.h>
#include "task.h"
#include<stdlib.h>
#define MAX_LINE_LENGTH 1024
int main()
{
    //讀檔案,開啟檔案等操作
    FILE *fpone;
    FILE *fptwo;
    fpone = fopen("E:\\Visual Stdio2013\\C++prime\\taskC\\taskC\\a.txt"
,"r"); fptwo = fopen("E:\\Visual Stdio2013\\C++prime\\taskC\\taskC\\b.txt", "w"); if (fpone == NULL) { perror("a.txt"); exit(EXIT_FAILURE); } if (fptwo == NULL) { perror("b.txt"); exit(EXIT_FAILURE); } //把原始資料儲存起來,使用動態記憶體 int max = 10; int
*a_ptr = (int *)malloc(max*sizeof(int)); int *b_ptr; if (a_ptr == NULL) { perror("開闢記憶體"); exit(-1); } char ch; int i=0, j=0; //獲取原始資料,並存儲在指標a_ptr所指向的空間中 while ((ch = fgetc(fpone)) != EOF) { printf("%c\n"); a_ptr[i++] = ch; j++; if
(i >= max) { max = max * 2; b_ptr = (int *)realloc(a_ptr, max*sizeof(int)); if (b_ptr == NULL) { perror("開闢記憶體"); exit(-1); } a_ptr = b_ptr; } } //處理資料 for (int m = j-1; m >=0; m--) { for (int n = m; n >=0; n--) { if (a_ptr[n] == '\n'||n==0) { //重新構造順序 int j = (n == 0 ? n : (n + 1)); int i = m; for (; i >= (n + m) / 2, j <= (n + m) / 2; i--,j++) { int temp = a_ptr[i]; a_ptr[i] = a_ptr[j]; a_ptr[j] = temp; } m = n; break; } } } //寫入另外一個檔案 for (; --j >= 0;) { fputc(a_ptr[j], fptwo); } //關閉檔案操作 if (fclose(fpone) != 0) { perror("fclose"); exit(EXIT_FAILURE); } if (fclose(fptwo) != 0) { perror("fclose"); exit(EXIT_FAILURE); } free(b_ptr); return 0;

其中,從檔案1中獲取到資料儲存起來,舉例顯示為:
1 2 ‘\n’ 3 4 ‘\n’ 5 6
如果不進一步處理的話,按照原始形式儲存起來,結果就會是:
6 5 ‘\n’ 4 3 ‘\n’ 2 1
因此,需要加處理操作。
處理操作主要是將每一個換行符號中間的資料進行前後互換操作,最後可得出正確的結果。
本程式碼中還使用到了動態開闢記憶體。一次性分配太多記憶體會浪費掉空間。因此,先使用malloc開闢記憶體,然後再使用realloc 動態擴充套件記憶體。

最後,對於C語言的檔案知識進行一個小總結:
(1)C語言操作檔案的一般步驟:
 定義檔案指標;
 開啟檔案;
 操作檔案;
 關閉檔案
(2)定義檔案指標,開啟檔案,並判斷開啟過程是否出錯。

FILE *fpone;
fpone = fopen("E:\\Visual Stdio2013\\C++prime\\taskC\\taskC\\a.txt","r");
if (fpone == NULL)
{
    perror("a.txt");
    exit(EXIT_FAILURE);
}

(3)操作檔案
其中操作字元有三組函式:
通過函式定義需要操作的流:

int fgetc(FILE *stream)
int fputc(int character, FILE *stream)

通過巨集定義需要操作的流:

int getc(FILE *stream)
int putc(int character, FILE *stream)

從標準輸入讀取等操作:

int getchar()
int putchar(int character)

其中操作字串的函式如下:

char *fgets(char *buffer, int buffer_size,FILE *stream)
char *fputs(char const *buffer,FILE *stream)
int *gets(char *buffer)
int *puts(char const *buffer)

示例程式碼:
如果需要把一個檔案中的內容拷貝到另一個檔案中,則有如下操作:
字串式的拷貝:
首先定義兩個檔案指標fpone,fptwo

char buffer[MAX_LINE_LENGTH];
While (fgets (buffer, MAX_LINE_LENGTH, fpone)!=NULL)
{
    fputs(buffer, fptwo);
}

字元式的拷貝:
首先定義兩個檔案指標fpone,fptwo

char ch;
While((ch= fgetc(fpone))!=EOF)
{
    fputc(ch, fptwo);
}