我正在尝试使用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�
�
�
我该如何解决?
答案 0 :(得分: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
自然配对,但{{1}}更容易使用,并且与原始方法的精神相同。