不包含stdio.h头文件,如何读写文件

sunmaxwell 2014-10-31 10:12:24
MISRA-C 2004标准中说,

“规则 20.9(强制): 在产品代码中不应使用输入/输出库<stdio.h>。
[未指定 2-5,16-18;未定义 77-89;实现 53-68]
这包含文件和I/O 函数fgetpos、fopen、ftell、gets、perror、remove、rename 和ungetc。
64
流和文件I/O 具有大量未指定的、未定义的和实现定义的行为。本文档中假定正常情况下
嵌入式系统的产品代码中不需要它们。
如果产品代码中需要 stdio.h 中的任意特性,那么需要了解与此特性相关的某些问题。”

如果这样,那么在c语言中,读写文件该怎么实现,我都是用fopen打开文件的啊~求解~~~
...全文
444 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Saleayas 2014-10-31
  • 打赏
  • 举报
回复
单独使用一个 C 文件,使用 stdio.h. 她们仅仅是定义。
dbzhang800 2014-10-31
  • 打赏
  • 举报
回复
引用 2 楼 sunmaxwell 的回复:
[quote=引用 1 楼 JiangWenjie2014 的回复:] 那就用系统提供的文件操作啊,windows(Windows.h)有CreateFile,ReadFile;linux(fcntl.h, unistd.h)有open,read,write,close。
Windows下的CreateFile、ReadFile函数都是C++函数,我想问的是C语言哈,这个标准是针对C语言的,所以很困惑~Linux这些函数好像是针对C语言的,在Linux系统下开发得少了一点。 Syntax C++ HANDLE WINAPI CreateFile( __in LPCTSTR lpFileName, __in DWORD dwDesiredAccess, __in DWORD dwShareMode, __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, __in DWORD dwCreationDisposition, __in DWORD dwFlagsAndAttributes, __in_opt HANDLE hTemplateFile );[/quote] 这明明是C函数,你怎么说是C++函数呢?
赵4老师 2014-10-31
  • 打赏
  • 举报
回复
Low-level I/O These functions invoke the operating system directly for lower-level operation than that provided by stream I/O. Low-level input and output calls do not buffer or format data. Low-level routines can access the standard streams opened at program startup using the following predefined handles: Stream Handle stdin 0 stdout 1 stderr 2 Low-level I/O routines set the errno global variable when an error occurs. You must include STDIO.H when you use low-level functions only if your program requires a constant that is defined in STDIO.H, such as the end-of-file indicator (EOF). Low-Level I/O Functions Function Use _close Close file _commit Flush file to disk _creat, _wcreat Create file _dup Return next available file handle for given file _dup2 Create second handle for given file _eof Test for end of file _lseek, _lseeki64 Reposition file pointer to given location _open, _wopen Open file _read Read data from file _sopen, _wsopen Open file for file sharing _tell, _telli64 Get current file-pointer position _umask Set file-permission mask _write Write data to file _dup and _dup2 are typically used to associate the predefined file handles with different files.
sunmaxwell 2014-10-31
  • 打赏
  • 举报
回复
引用 1 楼 JiangWenjie2014 的回复:
那就用系统提供的文件操作啊,windows(Windows.h)有CreateFile,ReadFile;linux(fcntl.h, unistd.h)有open,read,write,close。
Windows下的CreateFile、ReadFile函数都是C++函数,我想问的是C语言哈,这个标准是针对C语言的,所以很困惑~Linux这些函数好像是针对C语言的,在Linux系统下开发得少了一点。 Syntax C++ HANDLE WINAPI CreateFile( __in LPCTSTR lpFileName, __in DWORD dwDesiredAccess, __in DWORD dwShareMode, __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, __in DWORD dwCreationDisposition, __in DWORD dwFlagsAndAttributes, __in_opt HANDLE hTemplateFile );
JiangWenjie2014 2014-10-31
  • 打赏
  • 举报
回复
那就用系统提供的文件操作啊,windows(Windows.h)有CreateFile,ReadFile;linux(fcntl.h, unistd.h)有open,read,write,close。
Saleayas 2014-10-31
  • 打赏
  • 举报
回复
所以我的第一个回复就是告诉,使用一个单独的 C 文件。
sunmaxwell 2014-10-31
  • 打赏
  • 举报
回复
引用 10 楼 Saleayas 的回复:
MISRA 标准是针对想汽车控制系统,这类嵌入式的,永远运行,安全至上的软件。
你在这类嵌入式中使用 fopen 是不标准的。

您可以参考9楼的回答哈~谢谢您这么热心地回答~~
Saleayas 2014-10-31
  • 打赏
  • 举报
回复
而且,我觉得如果是你使用 Windows 操作系统,这个标准就没有意义了。 因为这个标准是针对嵌入式的。 因为在 Windows 编程中,使用的库都是可能有动态内存分配的。
sunmaxwell 2014-10-31
  • 打赏
  • 举报
回复
引用 9 楼 s_a_n_ 的回复:
那个标准不是说的很清楚吗? 就是说,标准本身是假定你没有stdio.h中规定的i/o需求的。而现在你有读写文件的需求,因此,需要你的嵌入式系统支持你读写文件这类操作。对于标准情况而言,这类操作可能包含大量为定义的行为,因此,至于如何使用,只有从你的系统本身那里找答案。 ps:提示一下,怎么读写文件要看你的文件系统接口,如果你的系统里根本没有文件系统,那么就不能读写文件。
您说得还是蛮有道理的,谢谢您的回答
Saleayas 2014-10-31
  • 打赏
  • 举报
回复
在二进制代码中, C++ 生成的 和 C 没有区别。 所有 C++ 的代码,都可以以 C 的方式写出来。 所以不管 CreateFile 时候是有 C 语言写的,结果都是一样的。 在 MSDN 文档中,C++ 这个标签包含了 C,因为这个 文档是给 vS 用的。 和这个标签平齐的不是 C,而是 C#、JavaScript、F# 和 VB 这些语言。
sunmaxwell 2014-10-31
  • 打赏
  • 举报
回复
引用 8 楼 dbzhang800 的回复:
[quote=引用 6 楼 sunmaxwell 的回复:]
额。。。不至于吧?这是MSDN的官方解释,C++代码~~你可以自己动手查下~


你不妨把你看到的官方解释贴出来。 这个说法,其他人估计还真查不出来。
[/quote]
Saleayas 2014-10-31
  • 打赏
  • 举报
回复
MISRA 标准是针对想汽车控制系统,这类嵌入式的,永远运行,安全至上的软件。 你在这类嵌入式中使用 fopen 是不标准的。
sanzhong104204 2014-10-31
  • 打赏
  • 举报
回复
那个标准不是说的很清楚吗? 就是说,标准本身是假定你没有stdio.h中规定的i/o需求的。而现在你有读写文件的需求,因此,需要你的嵌入式系统支持你读写文件这类操作。对于标准情况而言,这类操作可能包含大量为定义的行为,因此,至于如何使用,只有从你的系统本身那里找答案。 ps:提示一下,怎么读写文件要看你的文件系统接口,如果你的系统里根本没有文件系统,那么就不能读写文件。
dbzhang800 2014-10-31
  • 打赏
  • 举报
回复
引用 6 楼 sunmaxwell 的回复:
额。。。不至于吧?这是MSDN的官方解释,C++代码~~你可以自己动手查下~
你不妨把你看到的官方解释贴出来。 这个说法,其他人估计还真查不出来。
sunmaxwell 2014-10-31
  • 打赏
  • 举报
回复
引用 5 楼 Saleayas 的回复:
单独使用一个 C 文件,使用 stdio.h. 她们仅仅是定义。
您好,谢谢您的回答。MISRA C 2004标准不允许使用stdio.h啊,所以另外包含一个也无济于事的哈~~
sunmaxwell 2014-10-31
  • 打赏
  • 举报
回复
引用 4 楼 dbzhang800 的回复:
[quote=引用 2 楼 sunmaxwell 的回复:] [quote=引用 1 楼 JiangWenjie2014 的回复:] 那就用系统提供的文件操作啊,windows(Windows.h)有CreateFile,ReadFile;linux(fcntl.h, unistd.h)有open,read,write,close。
Windows下的CreateFile、ReadFile函数都是C++函数,我想问的是C语言哈,这个标准是针对C语言的,所以很困惑~Linux这些函数好像是针对C语言的,在Linux系统下开发得少了一点。 Syntax C++ HANDLE WINAPI CreateFile( __in LPCTSTR lpFileName, __in DWORD dwDesiredAccess, __in DWORD dwShareMode, __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, __in DWORD dwCreationDisposition, __in DWORD dwFlagsAndAttributes, __in_opt HANDLE hTemplateFile );[/quote] 这明明是C函数,你怎么说是C++函数呢?[/quote] 额。。。不至于吧?这是MSDN的官方解释,C++代码~~你可以自己动手查下~

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧