如何修改从一个文件到另一个文件的流

时间:2019-06-20 14:34:00

标签: c

我需要制作一个程序,该程序从一个文件中获取字符串数据,并将每三个字符从其中复制到另一个文件中。

我不确定我是否做对了。我得到的想法是,首先创建一个数组,在其中存储来自file1的原始数据,然后使用“ for”循环,我将修改数据并将其存储在第二个数组中: (例如对于(i = 0; i

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define BUFFER_SIZE 50

int main(int argc, char *argv[]) {
    char buffer[BUFFER_SIZE];
    char modified[BUFFER_SIZE];
    int input_fd, output_fd;
    ssize_t ret_in, ret_out;
    if(argc !=3 || strcmp(argv[1], "--help") == 0)
    {
        printf("Usage: %s file_origin file_destination\n", argv[0]);
        return 2;
    }
    input_fd = open(argv[1], O_RDONLY);
    if(input_fd == -1)
    {
        perror("There is no such file");
        return 2;
    }
    out_fd = open(argv[2], O_RDWR | O_CREAT | O_TRUNC, 0644);
    if(output_fd == -1)
    {
        perror("create");
        return 3;
    }

有人可以告诉我如何正确使用读/写功能将数据流式传输到数组,以及如何以其他方式进行处理。

3 个答案:

答案 0 :(得分:1)

欢迎来到Stackoverflow!

鉴于您对作业的确切描述,我不会使用缓冲区;您可以简单地一次从输入文件读取一个字节,然后将每三个字节写入输出文件。这样可以避免任何缓冲区管理开销。

但是,如果确实从输入文件读取了缓冲区,则无需以任何方式修改该缓冲区,也不需要第二个缓冲区。读取所有数据后,只需遍历输入缓冲区,将每三个字节输出到输出文件即可。

但是,如果您希望/需要以某种方式重用输出,则可以简单地以相同的方式从输入缓冲区填充第二个缓冲区(循环遍历输入缓冲区,每次迭代跳过两个字节),然后写入第二个缓冲区到输出文件。 (这样,您在第二个缓冲区中仍然具有相同的输出,并且可以以某种方式重用它。)

您采用的方法将决定要使用的最佳功能。我知道您已经了解open()。阅读read()write()close(),但也阅读fopen()fgetc()fgets()fread()fwrite()fclose()。通过阅读有关这些各种功能,它们之间的相似之处,彼此之间的差异以及它们的优缺点,您可以学到很多东西。阅读它们将使您学习其他相关的文件操作(例如查找,倒带等),当您全面了解有关C和编程的知识时,它们将对您有帮助。

请注意,对于使用缓冲区的方法,您需要非常注意缓冲区的大小与输入文件的大小。这里有很多陷阱。如果这是针对某类课程的一项作业,那么这些注意事项可能会在以后的课程/作业中显示出来,也许现在承担太多。但是开始思考您要做的事情和不知道程序需要处理的输入永远不会太早。

答案 1 :(得分:0)

如果您不需要cin或cout,我建议以下内容(我假设字符串以换行符结尾,并且这些字符串应保留在输出中,并且在读取的每一行中重新计算第3个字符):

FILE *f1=fopen("_infile.txt","rt");
FILE *f2=fopen("_outfuile.txt","wt");

char buffer[MAXBUFLEN];

while (!feof(f1)) {
    if (fgets(buffer,MAXBUFLEN,f1)>0) {
        for(int i=2;i<strlen(buffer);i+=3) {
            fprintf(f2,"%c",buffer[i]);
        }
        fprintf(f2,"\n");
    } else break;
}

fclose(f1);
fclose(f2);

答案 2 :(得分:0)

这将读取输入文件并每输出第三个字符重新打印一次。您可以根据情况进行调整。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    size_t i; // index
    int c; // char read

    FILE *FIN, *FOUT; // file streams
    if ((FIN = fopen("in.txt", "rb")) == NULL) {
        printf("Error opening input file.\n Exiting.\n");
        exit(1);
        }
    if ((FOUT = fopen("out.txt", "wb")) == NULL) {
        printf("Error opening output file.\n Exiting.\n");
        exit(1);
        }
    // read input and reprint every third character
    for(i=0;;i++)
        {
        c = fgetc(FIN); // read byte
        if(c == EOF)
            {
            break; // reached end of file (input), leave loop
            }
        if((i%3)==2) // get every third character by modulo(i)
            {
            fputc(c, FOUT); // write output
            }
        }

    fclose(FIN);
    fclose(FOUT);

return 0;
}