可以将文本文件读为二进制吗? 我正在研究GLSL着色器程序加载程序。着色器程序只是内部带有源代码的纯文本。我可以通过以二进制模式调用fopen()来打开它们,这很容易。但是作为我的来源fi ...

问题描述 投票:0回答:2
读取。因此,如果有比缓冲区更长的行,则读取将失败。但是程序……顺便说一句,它们是文本文件……在二进制模式下读取文本文件的缺点是什么?可能正在编码或线路结束问题?我应该怎么办?我应该以二进制模式或文本模式读取它们吗?

	
以文本模式读取文本文件的缺点。
交叉平台用法

c fopen
2个回答
5
投票
文本模式下打开。 然而,与跨平台一起工作可以很容易地破坏文件处理,如果文件在

fgets()系统中读取 - visaversa.

要井井有条,仅处理此文本文件的变化,就需要我们在
    least
  • 4条件下进行测试:

"\n"文件在

"\r\n"
系统中读取。
"\n"

文件在

"\n"系统中读取。

"\n"
    文件在
  • "\r\n"
    系统中读取。
    
    "\r\n"
    文件在
  • "\n"
  • 系统中读取。
    如果文件被读为二进制,我们担心案例数的一半,因此是测试优势。
    
  • "\r\n"
  • 文件
    "\r\n"
    文件
    
  • 我们可以在上面的2个情况下读取
  • line
    ,然后用常见代码删除潜在的终端:
    "\n"
    thyet足够了吗?
这并不是真正的旧系统被称为使用

"\r\n"

作为终点。在这种情况下,上述代码不足,因为
    fgets()
  • 找不到
    buf[strcspn(buf, "\n\r")] = '\0';
    
  • 上面的代码也假定除了在线结束外没有出现。 其他考虑
  • 铅字节可能是一个byte-dorder-mark

最后一个字节可能是一个ctrl

z

,它并不是文本的一部分。

线可能是'\r'

fgets()

'\n'
,或其他人的混合物,因为混合的历史记录编辑者假设了一定的结局。
最后一行可能/无法以适当的线结束字符结束。
narrow vs.宽字符。

形:通过在文本模式下打开,我们依靠当前系统来处理当前文本文件格式,而不仅仅是我们在编写代码时所知道的。

bottomline

  • 使用文本模式,除非可以使用跨平台使用。

  • 文本文件上使用二进制模式,然后准备了

    BE处理many文本文件标准。 (IMO:这意味着将文件的至少部分读取为二进制文件,分析它是哪种类型的文本文件,然后在文本模式下以手工制作的文本手触及或重新打开文本模式。)

  • /

    '\r'
    /
    "\n"
    标志到
    "\r\n"
    几乎是关于newline转换的。

    "\r"
  • 仅通过ISS通过Newlines,
  • binary

    将将程序正在运行的操作系统转换为简单的单个字节Newlines。 GLSL编译器根本不在乎它看到的是哪种newline(Unix样式

    text
  • ,Windows/dos style,RISC OS样式
  • fopen

    ),这一切都是空间的,无论如何。

    也无需用拆分线呈现OpenGL。
  • binary
  • 采用一系列字符串是为了方便起见,因此您可以将一些常见的着色器字符串作为标头或类似的源字符串向量放在源字符串向量中。但是仅提供一个长字符串是完全可以的。

    如果您要以行处理为行,则应以文本模式打开文件。文本模式会自动将操作系统的线路断裂字符转换为
  • text
。因此,在Windows上,
\n

序列将被翻译为\n,并且

\r\n
    将用作行定界线;在Unix上,Newline字符已经是
  • \n\r

    ,因此不需要翻译,二进制模式和文本模式之间没有区别。

  • 我上面介绍了“适合专家的东西不适合新手”。如果您想继续前进,这是您的道路:
  • Get告诉no tome to 清除为什么不 adapt

    Learn
为输入库的镜像映像开发库

2
投票

或只是复制文件?如果是这样,没有问题。打开并复制。
在过去,我们对文本文件有了这件事;您可以在打开它们时得到平台的行为,并且在系统之间复制文件时,您必须转换行结尾。
日子正在过去;每个人都在文本模式下放弃
glShaderSource
,只是使用简单的状态机接受任何线路结尾。
    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.