【问题标题】:Using fwrite with char*使用 fwrite 和 char*
【发布时间】:2021-09-22 22:34:57
【问题描述】:

如何使用 fwrite 写入带有 char* 的文件?如果我想在文件末尾附加一个 char* 并在后面加上一个换行符,这样的事情是否正确?如果你有一个像这样的变量:

char* c = "some string";

会是:

FILE *fp = fopen("file.txt", "ab");
fwrite(c, sizeof(char*), sizeof(c), fp);
fwrite("\n", sizeof(char), 1, fp);
close(fp);

我对第二个 fwrite 语句有点困惑。是 sizeof(char*) 还是 sizeof(char)?我也应该有 sizeof(c) 还是不正确?任何建议将不胜感激,谢谢。

【问题讨论】:

  • sizeof(char*) 是错误的,它返回指针本身的大小,而不是它指向的大小,你可能想要strlen(c) 那里。
  • 我不确定您是否理解指针、数组和字符串之间的区别。所以这里有一个简短的说明:fwrite 不输出char *。它输出char 的数组。 char * 的目的是告知该数组存储在内存中的哪个位置。或者更准确地说,它保存了该数组中第一个char 的地址。需要注意的是,char * 只知道数组的位置。它不知道数组有多大,或者数组中有多少元素被“使用”了。

标签: c pointers char c-strings fwrite


【解决方案1】:

fwrite 的第一次调用不正确。

fwrite(c, sizeof(char*), sizeof(c), fp);

应该写成例子

fwrite(c, sizeof( char ), strlen( c ), fp);

即在文件中写入字符串文字"some string",不包括其终止零字符。

至于这个电话

fwrite("\n", sizeof(char), 1, fp);

然后在文件fp中写入一个字符'\n'

注意:字符串文字 "\n" 在内部表示为两个元素 { '\n', '\0' } 的字符数组。

函数声明如下

size_t fwrite(const void * restrict ptr,
              size_t size, 
              size_t nmemb,
              FILE * restrict stream);

并根据 C 标准(7.21.8.2 fwrite 函数)

2 fwrite 函数从 ptr 指向的数组中写入,直到 nmemb 元素的大小由大小指定,指向流 通过流。对于每个对象,对 fputc 进行大小调用 函数,从 unsigned char 数组中获取值(按顺序) 完全覆盖对象。文件位置指示器 流(如果已定义)按字符数前进 成功写入。如果发生错误,则结果值 流的文件位置指示器是不确定的。

【讨论】:

    【解决方案2】:

    这里的其他答案和 cmets 会告诉您您发布的代码有什么问题,但更好的解决方案是使用 fputs,它专门用于写出以 nul 结尾的字符串:

    const char* c = "some string";
    
    FILE *fp = fopen("file.txt", "ab");
    fputs (c, fp);
    fputs ("\n", fp);
    fclose(fp);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 2012-03-22
      • 1970-01-01
      相关资源
      最近更新 更多