用C语言打开一个文件并将其内容读入字符串(char*、char[],随便什么),最简单的方法是什么(最不容易出错,代码行最少,不管你想如何解释它)?

推荐答案

我倾向于将整个缓冲区作为原始内存块加载到内存中,然后自己进行解析.这样,我可以最好地控制标准库在多个平台上执行的操作.

这是我用来做这个的存根.您可能还想判断FSEEK、FTELL和FREAD的错误代码.(为清楚起见省略).

char * buffer = 0;
long length;
FILE * f = fopen (filename, "rb");

if (f)
{
  fseek (f, 0, SEEK_END);
  length = ftell (f);
  fseek (f, 0, SEEK_SET);
  buffer = malloc (length);
  if (buffer)
  {
    fread (buffer, 1, length, f);
  }
  fclose (f);
}

if (buffer)
{
  // start to process your data / extract strings here...
}

C++相关问答推荐

在C中,entry = fgets(entry,sizeof(entry),*pt)是否是错误?

rSP堆栈指针在返回函数调用的值时有任何用途吗?

想了解 struct 指针和空指针转换

C中空终止符后面的数字?

sizeof结果是否依赖于字符串的声明?

不同到达时间的轮询实现

在C中使用动态内存分配找到最小的负数

为什么复合文字(C99)的返回会生成更多的汇编代码?

MISRA C:2012 11.3违规强制转换(FLOAT*)到(uint32_t*)

在列表中插入Int指针(C)

X86/x64上的SIGSEGV,由于原始内存访问和C中的DS寄存器之间的冲突,在Linux上用TCC编译为JIT引擎

为什么我会收到释放后堆使用错误?

&;(str[i])和(&;str)[i]有什么区别?

为 struct 中的数组动态分配内存时出错

Cairo STM32MP1 cairo_Surface_WRITE_TO_PNG始终返回CAROLIO_STATUS_WRITE_ERROR

这个空指针类型的转换是有效代码还是恶意代码?

For循环不会迭代所有字符串字符吗?(初学者问题)

C语言中的数字指针

Linux分段故障(核心转储)

如何在Rust中处理C的longjmp情况?