我必须在不使用任何包含库的情况下编写C程序。对于我的要求获取命令行参数并写入文件。当我写入文件时,它将写入特殊字符(垃圾)。请为我提供解决方案。只能使用read()和write()函数。
#define O_WRONLY 01
#define O_APPEND 02000
int main(int argc, char *argv[])
{
int fd;
fd = open("testfile.txt", O_WRONLY|O_APPEND, 0);
if(fd < 0 )
return 1;
if(argc != 4)
{
char bufMsg[] ="Parameters are missing!\n" ;
write(1, bufMsg, sizeof(bufMsg));
return 1;
}
else
{
int i = 0;
for (i = 1; i < argc; i++)
{
write(fd, argv[i],sizeof(argv[i]));
write(fd, " ",1 );
}
write(1, "\n", 1);
close(fd);
}
return 1;
}
答案 0 :(得分:0)
让我们从帮助您解决问题的第一部分开始。正如BLUEPIXY指出的那样,sizeof(argv[i])
指向字符的指针的大小 (sizeof(char*))
,不是字符串的长度。因此,您可以包含string.h
并使用strlen
函数或编写自己的函数。使用strlen
功能,您可以执行以下操作:
...
write(1, bufMsg, strlen (bufMsg));
...
write(fd, argv[i], strlen (argv[i]));
您可能还想修复:
write(1, "\n", 1); /* I suspect write(fd, "\n", 1); was intended */
在我们帮助的同时,您确定要重新定义:
#define O_WRONLY 01
#define O_APPEND 02000
这些数值可能完全正确(我没有检查),但为什么你想要首先做到这一点?头文件已经为您定义了它们。
为了回应您关于无法包含任何库的评论,虽然不清楚您是否表示头文件或其他内容,但您可以通过多种方式获取字符串的长度,而无需使用strlen
。例如,您可以使用以下slen
函数代替strlen
:
size_t slen (char *str)
{
char *p = str;
size_t ln = 0;
if (!p)
return -1;
while (*p++ != '\0')
ln++;
return ln;
}
继续你的评论。为了编译和运行程序,您至少,需要包含open
和write
文件所需的头文件。否则您的应用程序将无法编译。您可以依赖退出应用程序来关闭打开的文件描述符,但由于所需的头文件也提供close
,因此您可以包含close
以获得完整性。有了这个附带条件,您的程序的最小功能方法只会是open
和write
的用户:
#include <fcntl.h>
#include <unistd.h>
size_t slen (char *str)
{
size_t ln = 0;
if (!str) return -1;
while (*str++ != '\0') ln++;
return ln;
}
int main (int argc, char *argv[])
{
int fd;
if (argc != 4)
{
char bufMsg[] ="Error, incorrect arguments.\n usage: prog arg_1 arg_2 arg_3\n";
write (1, bufMsg, slen (bufMsg));
return 1;
}
fd = open ("testfile.txt",
O_WRONLY|O_CREAT|O_APPEND,
S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if (fd < 0 )
{
char fileMsg[] = "Error opening file\n";
write (1, fileMsg, slen (fileMsg));
return 1;
}
else
{
int i = 0;
for (i = 1; i < argc; i++)
{
write (fd, argv[i], slen (argv[i]));
write (fd, " ", 1);
}
write (fd, "\n", 1);
close (fd);
}
return 0;
}
构建
gcc -Wall -Wextra -o bin/ow onlywrite.c
运行:
./bin/ow Argument_1 Argument_2 Argument_3
输出:
$ ls -al testfile.txt
-rw-r--r-- 1 david david 34 Jul 30 02:52 testfile.txt
$ cat testfile.txt
Argument_1 Argument_2 Argument_3
答案 1 :(得分:0)
#define O_WRONLY 01
#define O_APPEND 02000
int main(int argc, char *argv[])
{
int fd;
fd = open("testfile.txt", O_WRONLY|O_APPEND, 0);
if(fd < 0 )
return 1;
if(argc != 4)
{
char bufMsg[] ="Parameters are missing!\n" ;
write(1, bufMsg, sizeof(bufMsg));
return 1;
}
else
{
int i = 0;
for (i = 1; i < argc; i++)
{
write(fd, argv[i],strlength(argv[i]));
write(fd, " ",1 );
}
write(1, "\n", 1);
close(fd);
}
return 1;
}
int strlength(const char *str)
{
const char *s;
for (s = str; *s; ++s)
;
return (s - str);
}