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

C 如何用严格的系统调用交换STDIO.H库函数?,c,linux,C,Linux,一种简单的程序,它接受终端指定的输入文件,并改变要反转的文本。如何将函数转换为仅linux系统调用?(我假设只使用像这样的库) #包括 #包括 #包括 字符*concat(常量字符*str1,常量字符*str2) { char*answer=malloc(strlen(str1)+strlen(str2)+1); strcpy(答案,str1); strcat(回答,str2); 返回答案; } int main(int argc,字符**argv){ 文件*fp; char*line=NULL

一种简单的程序,它接受终端指定的输入文件,并改变要反转的文本。如何将
函数转换为仅linux系统调用?(我假设只使用像
这样的库)

#包括
#包括
#包括
字符*concat(常量字符*str1,常量字符*str2)
{
char*answer=malloc(strlen(str1)+strlen(str2)+1);
strcpy(答案,str1);
strcat(回答,str2);
返回答案;
}
int main(int argc,字符**argv){
文件*fp;
char*line=NULL;
尺寸长度=0;
fp=fopen(argv[1],“r”);
如果(fp==NULL){
perror(“\n错误”);
出口(1);
}
char*rev1=“rev”;
char*rev2={argv[1]};
char*rev3=concat(rev1,rev2);
系统(rev3);
fclose(fp);
返回0;
}
谢谢你的帮助。公司只是出于某种原因希望我使用系统调用,这次实习并不顺利

不了解如何正确执行[
读取
写入
]

假设您的意思是调用它们(而不是实现它们),
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;
}
size\u t to\u write=strlen(str);
while(写){
ssize_t write=写入(fd、str、to_write);
如果(写入<0){
perror(空);
出口(1);
}
str+=书面形式;
写入-=已写入;
}
如果你知道你需要读多少,或者你试图读一个完整的文件,读的方式也是一样的。(要读取整个文件,请读取块,直到
read
返回
0
8*1024
的系数是很好的块大小。)

否则,情况会变得复杂得多。在阅读之前,你怎么知道要读多少?例如,如果要读取一行,在遇到终止换行符之前,您不知道该行有多长。你可以一次读一个字符,但效率很低。您可以像stdio一样使用一个缓冲区来保存多余的数据。此时您最好使用stdio。

/\35; include not used
//#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;
}
#包括 #包括 #包括 #包括 #包括 #包括 字符*交换(常量字符*一,常量字符*二) { char*result=malloc(strlen(一)+strlen(二)+1); strcpy(结果1); strcat(结果,两个); 返回结果; } int main(int argc,字符**argv){ 如果(argc!=2){ printf(“错误,参数数目错误!\n”); 出口(1); }
int fd=open(argv[1],O_RDONLY);//请求没有任何意义。例如,没有
printf
系统调用,尽管调用
printf
最终将导致系统调用(例如
write
)。这使得
printf
C代码可以进行系统调用,这正是您所要求的。stdio的其余部分也是如此。少数几个似乎具有直接系统调用等效项的函数(例如
fopen
fclose
)需要支持不需要的函数。也许他们需要无缓冲I/O?请澄清。我有理由相信unistd.h无论如何都是由glibc实现的,所以你仍然在使用C库。他们希望你用自己的代码进行中断调用吗?为什么?你能更具体地问他们想要什么,最好也举个例子。*the请求没有意义。交换是什么意思?将单词
fprintf
替换为
write
?不,它们有不同的参数。使用与
fprintf
具有相同参数的函数并调用
write
?您可以这样做。该函数名为
fprintf
。因此请求是有意义的。您需要o编写将在系统上运行的代码,与您自己的系统不同,您自己的系统没有这些例程。我想我现在只是在阅读
.txt
文件中的任何内容