使用read()函数读取文件

时间:2013-10-20 00:48:37

标签: c readfile

我正在尝试使用read()函数读取文件,如下所示:

char buf[1024];
int bytesRead;
int fildes;
char path[128];
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
int flags = O_RDONLY;
printf("\n-->Donner l'emplacement du fichier :");
scanf("%s", path)
fildes = ouvrir(path, flags, mode);
if(fildes == -1){
    printf("\nImpossible de lire le fichier. Réessayez plus tard. (%s)",strerror(errno));
}else{
    do{
        bytesRead = read(fildes, buf, 1);
        printf("%s", buf);
    }while(bytesRead != 0);
}

但我得到的输出为:

J�e� �m�'�a�p�p�e�l�e� �a�i�m�a�d�
�j�'�a�i� �1�7� �a�n�s�
� � �m�o�n� �e�m�a�i�l� �:� �s�p�o�o�n�a�t�t�e�@�g�m�a�i�l�.�c�o�m�
�
�

我该如何解决?

1 个答案:

答案 0 :(得分:0)

如果您只想按原样打印数据,为什么要使用格式化输出?将readwrite

配对
while ((bytesRead = read(fildes, buf, sizeof buf)) > 0)
{
    write(STDOUT_FILENO, buf, bytesRead);
}

另外,你一次只读取一个字节,这比一次读取更大的数据效率低 - 这里我使用的是你已经提供的整个缓冲区。

实际上,write也应该在循环中完成,因为单个调用可能无法写入所有数据:

for (ssize_t n; bytesRead > 0 &&
                (n = write(STDOUT_FILENO, buf, bytesRead)) > 0;
     bytesRead -= n) { }

或者你可以使用C库的无格式写:

fwrite(buf, 1, sizeof buf, stdout);

选择权在你手中。 write readfwrite自然配对,但{{1}}更容易使用,并且与原始方法的精神相同。