Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将流从一个文件修改为另一个文件_C - Fatal编程技术网

C 如何将流从一个文件修改为另一个文件

C 如何将流从一个文件修改为另一个文件,c,C,我需要制作一个程序,从一个文件中获取字符串数据,并每隔三个字符将其复制到另一个文件中 我不确定我是否做对了。我的想法是首先创建一个数组,在其中存储file1中的原始数据,然后使用“for”循环修改数据并存储在第二个数组中: eg fori=0;i

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

我不确定我是否做对了。我的想法是首先创建一个数组,在其中存储file1中的原始数据,然后使用“for”循环修改数据并存储在第二个数组中: eg fori=0;i<排列;i+=3; 问题是我不知道如何将输入传输到数组,以及如何将修改后的数据反向传输到文件2

#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;
    }


有人能告诉我如何正确使用函数read/write将数据流式传输到数组,以及如何以其他方式执行此操作。

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

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);

欢迎来到Stackoverflow

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

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

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

您所采取的方法将决定要使用的最佳功能。我看你已经知道公开赛了。在读取、写入和关闭时读取,但也在fopen、fgetc、fgets、fread、fwrite和fclose上读取。通过阅读这些不同的函数,你可以学到很多东西,它们之间有什么相似之处,它们之间有什么不同,以及它们各自的优缺点。阅读它们将引导您了解其他相关的文件操作,如查找、倒带等,这将有助于您更好地了解C和编程


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

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

#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;
}

cin或cout与两个问题都没有提到的C问题有什么关联?请注意——尽管您的代码比大多数代码都有点微妙的错误。您确实检查了fgets调用,这是通常被忽略的步骤,但是您确实不需要中断if;当fgetsbuffer、sizeofbuffer、f1!=0 { … }. 使用feof几乎总是不必要和不相关的;乔纳森·莱夫勒:在阅读我的数据流时,我首先想到的是cin和cout。您的代码更简单,我同意使用feof是没有必要的,但也没有错。欢迎使用。在回答C问题时,不要提及随机C++概念——这是粗心的和潜在的混淆。我说过,你使用feof的错误要比大多数人少——事实上,正如你所说的那样,它会正确工作。但这只是一种浪费,因为您格式化代码的方式,使用了2行额外的代码——在许多样式中可能需要4或5行。还有那个!feof测试永远不会失败,因为您的循环在测试失败时运行之前通过中断退出。例如,在尝试读取一个空文件的第一行之前,它不会失败。嗨,问题是我必须以非缓冲方式来做。在你对Marc M答案的评论中,你说你需要以非缓冲方式来做这件事;这有点令人困惑,因为您自己的代码使用了缓冲区;但是,对于非缓冲方法,请参见我答案的第一个建议:只需从输入文件一次读取一个字节,然后每三个字节写入输出文件;但是要做到这一点,您可能需要考虑各种I/O函数调用;我在回答中列出了一组好的答案;仔细阅读这些,你会学到很多关于如何做到这一点的知识