C语言文件编程题目

题目要求:读取文件file1.txt的内容:
12
34
56
输出到文件file2.txt:
56
34
12
解决思路
(1)首先把文件1中的数据获取到并存储起来;
(2)把数据显示到文件2中。
按照该思路,编写代码如下:

#include
#include "task.h"
#include
#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);
}

你可能感兴趣的:(C语言学习)