Как поменять местами библиотечные функции STDIO.H со строго системными вызовами? - PullRequest
0 голосов
/ 03 ноября 2019

Простая программа, которая принимает входной файл, указанный на терминале, и изменяет текст для обращения. Как функции <stdio.h> можно преобразовать только в системные вызовы linux? (Я предполагаю использовать только такие библиотеки, как <unistd.h>)

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

char* concat(const char *str1, const char *str2)
{
    char *answer = malloc(strlen(str1) + strlen(str2) + 1);
    strcpy(answer, str1);
    strcat(answer, str2);
    return answer;
}

int main(int argc, char** argv) {

    FILE * fp;
    char * line = NULL;
    size_t len = 0;

    fp = fopen(argv[1], "r");
    if (fp == NULL){
        perror("\nError ");
        exit(1);
    }

    char *rev1 = "rev ";
    char *rev2 = {argv[1]};
    char *rev3 = concat(rev1,rev2);

    system(rev3);

    fclose(fp);

    return 0;
}

Спасибо за любую помощь. Компания только хочет, чтобы я использовал системные вызовы по какой-то причине, эта стажировка не идет хорошо!

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

не понимают, как правильно реализовать [read и write]

Предполагая, что вы имеете в виду вызывать их (не реализовывать их),улов с read и write в том, что они могут читать или писать меньше, чем требуется, поэтому вы должны вызывать их в цикле.

size_t to_write = strlen(str);
while (to_write) {
   ssize_t written = write(fd, str, to_write);
   if (written < 0) {
      perror(NULL);
      exit(1);
   }

   str      += written;
   to_write -= written;
}

Чтение работает так же, если вы знаете, сколько вынужно прочитать или если вы пытаетесь прочитать весь файл. (Чтобы прочитать весь файл, читайте куски до тех пор, пока read не вернет 0. Факторы 8*1024 будут хорошими размерами кусков.)

В противном случае все становится намного сложнее. Как вы знаете, сколько читать, прежде чем читать? Например, если вы хотите прочитать строку, вы не знаете, какова длина строки, пока вы не встретите завершающий перевод строки. Вы можете читать персонажа за раз, но это очень неэффективно. Вы можете делать то же самое, что и stdio, и использовать буфер, который содержит избыток. В этот момент вы можете использовать stdio.

0 голосов
/ 04 ноября 2019
//#include<stdio.h> not used
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
char* swap(const char *one, const char *two)
{
    char *result = malloc(strlen(one) + strlen(two) + 1);
    strcpy(result, one);
    strcat(result, two);
    return result;
}
int main(int argc, char** argv) {

if (argc != 2){
printf("Error, wrong number of arguments!\n");
exit(1);
}
    int fd = open(argv[1], O_RDONLY); //<------------------<
    char * line = NULL;
    size_t len = 0; 
   char *string1 = "rev ";
   char *string2 = {argv[1]};
   char *result = swap(string1,string2);
   system(result); 

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