C語言檔案程式設計題目
阿新 • • 發佈:2019-01-09
題目要求:讀取檔案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);
}