一个简单的程序,它接收在终端上指定的输入文件,并更改要反转的文本。如何将<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;
}
感谢您的帮助。公司出于某些原因只希望我使用系统调用,所以这次实习并不顺利!
答案 0 :(得分:1)
不了解如何正确实施[
read
和write
]
假设您的意思是调用它们(而不是实现它们),则read
和write
的缺点是它们的读取或写入次数可能少于请求的次数,因此您必须循环调用它们。 / 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;
}