C++中写/读二进制/文本的区别 [英] Differences between writing/reading binary/text in c
本文介绍了C++中写/读二进制/文本的区别的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在开发一个客户端/服务器程序,客户端在该程序中发送/接收文件。文件可以是文本文件或二进制文件。但是,我不确定需要进行哪些更改(如果有的话)才能适应这两种文件类型。基本上,我正在寻找读/写服务器端的文件,而不管它是什么类型的文件,我希望能够这样做,而不检查它是什么类型的文件。这样的代码可以工作吗?为什么或为什么不?
服务器代码段:
//CREATING/WRITING TO A FILE
//we are ready to begin reading data from the client, and storing it
int fd = open(pathname, O_CREAT | O_WRONLY | O_EXCL, S_IRUSR | S_IWUSR);
while(nbytes < bytes)
{
//only read the neccessary # of bytes: the remaining bytes vs max buffer size
int min_buffer = (bytes - nbytes) < BUFFER_SIZE ? (bytes - nbytes) : BUFFER_SIZE;
length = recv( client->client_socket, contents, min_buffer, 0);
if(fd < 0) //the fd is bad, but we need to continue reading bytes anyway
{
nbytes += length;
continue;
}
if(length <= 0)
break;//string empty or error occurred...this error means the client closed?
if(write(fd, contents, min_buffer) != min_buffer)
{
//printf("There was an error writing to the file.
");
}
else
{
nbytes += length;
}
}
//READING A STORED FILE AND SENDING THE DATA TO CLIENT
int fd = open(pathname, O_RDWR, S_IRUSR | S_IWUSR);
if(fd >= 0)
{
while(bytes > 0)
{
bytes = read(fd, buffer, BUFFER_SIZE );
if(bytes > 0)//we have read some bytes
{
//send the client the data
write(client->client_socket, buffer, bytes);
}
else if(bytes < 0)
{
//some error occured
write( client->client_socket, "ERROR: Could not read
", 22);
return;
}
}
}
因此,如果客户端发送二进制文件而不是文本文件,此代码会导致问题吗?(我们可以假定客户端知道预期的文件类型。)
注意:关于这一点的另一个令人困惑的细节是,有一些关于用c编写/读取二进制文件的教程似乎与常规文件没有任何真正的区别,这正是我来到这里的原因。
推荐答案
只需对"二进制"文件执行所有操作。在操作系统级别上,Linux在文件中没有"文本"和"二进制"之分,只是文件中有字节。即。希望文件包含每个可能的字节值,并且不要为不同种类的内容编写不同的代码。
Windows中有一个区别:Windows中的文本模式意味着程序中的换行符(
)在向文件写入/从文件读取时转换为
或从
转换为
。以二进制模式读取的写入文本文件将包含这两个字节,而不是原始的
,反之亦然。(此外,MS在文档中并不是很清楚这是唯一的区别,它很容易让初学者感到困惑。)
如果您使用标准C和fclose
而不是特定于Linux的open
等,则可以指定以二进制或文本模式打开文件(在Linux上也是如此)。这是因为使用fOpen的代码应该可以在Windows和Linux上运行,而不需要任何特定于操作系统的更改;但在Linux上运行时,您在fOpen中选择什么并不重要(可以通过阅读fOpen的源代码等进行验证)
和关于套接字:
Linux:没有区别(再一次)
Windows:也没什么不同。只有字节,没有奇怪的换行符转换。
这篇关于C++中写/读二进制/文本的区别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文