Как изменить поток из одного файла в другой - PullRequest
0 голосов
/ 20 июня 2019

Мне нужно сделать программу, которая берет строковые данные из одного файла и копирует каждый третий символ из него в другой файл.

Я не уверен, правильно ли я это делаю. Идея, которую я получил, состоит в том, чтобы сначала создать один массив, в котором я буду хранить исходные данные из файла file1, а затем с помощью цикла for я изменю данные и сохраню их во втором массиве: (например, для (i = 0; i <размер массива; i + = 3); Дело в том, что у меня нет идеи, как передать входные данные в мой массив и как сделать это задом наперед, чтобы мои измененные данные были переданы в file2. </p>

#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 ]

1 голос
/ 20 июня 2019

Добро пожаловать в Stackoverflow!

Учитывая точное описание вашего задания, я бы не стал использовать буфер; Вы можете просто читать из входного файла по одному байту за раз и записывать каждый третий байт в выходной файл. Это позволяет избежать каких-либо накладных расходов на управление буфером.

Но, если вы читаете из входного файла в буфер, вам не нужно каким-либо образом изменять этот буфер, а также вам не нужен второй буфер. После прочтения всех данных просто переберите входной буфер и выведите каждый третий байт в выходной файл.

Но, если вы хотите / должны каким-то образом повторно использовать вывод, вы можете просто заполнить второй буфер из входного буфера тем же способом (перебрать входной буфер, пропуская два байта на каждую итерацию), а затем записать этот второй буфер для выходного файла. (Таким образом, у вас все тот же вывод во втором буфере, и вы можете использовать его каким-либо образом.)

Ваш подход диктует лучшие функции для использования. Я вижу, вы уже знаете о open(). Читайте о read(), write() и close(), а также читайте о fopen(), fgetc(), fgets(), fread(), fwrite() и fclose(). Читая об этих различных функциях, о том, как они похожи друг на друга, как они отличаются друг от друга, а также о плюсах и минусах каждой из них, можно многому научиться. Чтение о них приведет вас к изучению других связанных с файлами операций (таких как поиск, перемотка и т. Д.), Которые пригодятся вам, когда вы узнаете больше о C и программировании в целом.

Обратите внимание, что для подходов, использующих буферы, вы должны быть очень осторожны относительно размера ваших буферов по сравнению с размером входного файла. Здесь много подводных камней. Если это задание для какого-то класса, то эти соображения могут появиться в последующих уроках / заданиях, и, возможно, это слишком много, чтобы принять их прямо сейчас. Но никогда не бывает слишком рано думать о том, что вы делаете, и не знаете о том, что ваша программа должна обработать.

0 голосов
/ 21 июня 2019

Это будет читать входной файл и перепечатывать каждый третий символ для вывода.Вы можете адаптировать его к вашей ситуации.

#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;
}
0 голосов
/ 20 июня 2019

Если вам не нужны 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...