Проблемы с копированием текстового файла и вставкой его в новый файл C - PullRequest
0 голосов
/ 08 мая 2018

У меня проблемы с школьным заданием, в настоящее время код работает на то, чтобы ребенок получал и помещал текст в новый текстовый файл. файл, за исключением родительского, успешно создан, но пуст.

мои текстовые файлы выглядят так

1 текст для копирования в child1.

0 текст для копирования в родительский

и мои коды ниже

int main(){
    int c1,c2,c3 ;
    FILE *fp1,*fpm, *fp2;
    char str1[100];
    char str2[100];
    fp1 = fopen("test.txt","r");
    fpm = fopen("mainlog.txt","w");
    fp2 = fopen("child1log.txt","w");

    c1 = fork();
    if(c1 == 0){
        printf("child Process\n");
        while ((fgets(str1,80,fp1))!=NULL){
            if(str1[0]=='1'){
                fputs(str1+1,fp2);
            }
        }
    }
    else{
        printf("This is parent Process\n");
        while ((fgets(str,80,fp1))!=NULL){
            if(str[0]=='0'){
                fputs(str+1,fpm);
            }
        }
    }

    return 0;
}

Помощь приветствуется.

1 Ответ

0 голосов
/ 08 мая 2018

Дескриптор открытого файла, лежащий в основе fp1, указывает на описание открытого файла (да - это терминология POSIX; см. open()). После fork() каждый процесс имеет собственный дескриптор открытого файла для файла, но они разделяют описание открытого файла. И позиция чтения является свойством описания открытого файла.

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

Вы можете открыть файл для чтения после fork(); по крайней мере, это, вероятно, самый простой способ избежать неприятностей. Кроме того, процессы могут быть перемотаны перед чтением. С одной стороны, это было бы бездействующим, но с другой это имело бы значение. В этом контексте вы могли бы также прочитать перед форком, который заполнил бы буфер для fp1 данными, и оба процесса увидят, что было прочитано. Это, вероятно, считается обманом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...