FILE无缓冲I / O的问题:在C中读写字符串

时间:2014-11-15 09:42:47

标签: c file unix input output

我是计算机科学的学生,使用无缓冲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);

}

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您无法使用sizeof来确定运行时字符串的长度。

您根本不需要使用snprintfargv中的字符串可以直接写入输出文件。

请改为尝试:

write(fd,argv[i],strlen(argv[i]));

另请注意,这不会输出单词之间的任何空格或换行符。

答案 1 :(得分:0)

  1. 您正在使用sizeof来获取字符串的长度。返回指针的大小(通常为4)而不是字符串的长度。应该使用strlen代替。

  2. 您没有查看writeread的结果。它们可能会失败,或者只能读/写您所要求的部分内容。

  3. sprintfread不需要将字符串写入文件。尝试:

    for(i = 2; i < argc; i++){
        write(fd, argv[i], strlen(argv[i]));
    }
    

    请注意,这仍然不会检查write的返回值。