0

我正在尝试使用 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�
�
�

我该如何解决?

4

1 回答 1

0

如果您只想按原样打印数据,为什么要使用格式化输出?read与您配对write

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与 配对更自然read,但fwrite更易于使用,并且与您的原始方法具有相同的精神。

于 2013-10-20T00:53:06.350 回答