我是计算机科学的学生,使用无缓冲I / O功能练习,我试着在C中编写一些简单的代码。这段代码创建一个文件,然后尝试在这个文件中写入一个或多个字符串,我们从终端传递。输出不符合预期。这些是我在终端上写的命令。
gcc file_IO.c
./a.out file.txt hello world
cat file.txt
hello��*world2��
在“file.txt”中只有字符串“hello”。如何打印写入文件的字符串?
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <string.h>
#define BUFFER_SIZE 1024
int main(int argc, char *argv[])
{
mode_t access_mode = S_IRUSR | S_IWUSR;
int flags = O_RDWR | O_CREAT | O_TRUNC;
int fd, i,n_char,index = 0;
char buffer[BUFFER_SIZE];
char buff_out[BUFFER_SIZE];
if( (fd = open(argv[1], flags, access_mode)) == -1 ){
perror("open");
exit(EXIT_FAILURE);
}
for(i = 2; i < argc; i++){
n_char = sprintf(buffer+index,"%s",argv[i]);
write(fd,buffer+index,sizeof(argv[i]) *4);
read(fd,buff_out,sizeof(argv[i]) * 4);
index += (strlen(argv[i]) +1);
}
if(( close(fd)) == -1 ){
perror("close");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
感谢您的帮助。
答案 0 :(得分:0)
您无法使用sizeof
来确定运行时字符串的长度。
您根本不需要使用snprintf
。 argv
中的字符串可以直接写入输出文件。
请改为尝试:
write(fd,argv[i],strlen(argv[i]));
另请注意,这不会输出单词之间的任何空格或换行符。
答案 1 :(得分:0)
您正在使用sizeof
来获取字符串的长度。返回指针的大小(通常为4)而不是字符串的长度。应该使用strlen
代替。
您没有查看write
和read
的结果。它们可能会失败,或者只能读/写您所要求的部分内容。
sprintf
和read
不需要将字符串写入文件。尝试:
for(i = 2; i < argc; i++){
write(fd, argv[i], strlen(argv[i]));
}
请注意,这仍然不会检查write
的返回值。