如何用严格的系统调用交换STDIO.H库函数?

时间:2019-11-03 16:09:30

标签: c linux

一个简单的程序,它接收在终端上指定的输入文件,并更改要反转的文本。如何将<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 个答案:

答案 0 :(得分:1)

  

不了解如何正确实施[readwrite]

假设您的意思是调用它们(而不是实现它们),则readwrite的缺点是它们的读取或写入次数可能少于请求的次数,因此您必须循环调用它们。 / p>

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。

答案 1 :(得分:0)

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