【问题标题】:stdio data from write not making it into a file来自写入的 stdio 数据未写入文件
【发布时间】:2012-10-28 22:19:52
【问题描述】:

我在使用 stdio 命令处理文件中的数据时遇到问题。简而言之,当我将数据写入文件时,write 返回一个 int 表示它是成功的,但是当我读回它时,我只得到旧数据。

这是代码的精简版:

fd = open(filename,O_RDWR|O_APPEND);

struct dE *cDE = malloc(sizeof(struct dE));

//Read present data
printf("\nreading values at %d\n",off);
printf("SeekStatus <%d>\n",lseek(fd,off,SEEK_SET));
printf("ReadStatus  <%d>\n",read(fd,cDE,deSize));

printf("current Key/Data <%d/%s>\n",cDE->key,cDE->data);

printf("\nwriting new values\n");
//Change the values locally 
cDE->key  = //something new
cDE->data = //something new

//Write them back
printf("SeekStatus  <%d>\n",lseek(fd,off,SEEK_SET));
printf("WriteStatus <%d>\n",write(fd,cDE,deSize));

//Re-read to make sure that it got written back
printf("\nre-reading values at %d\n",off);
printf("SeekStatus <%d>\n",lseek(fd,off,SEEK_SET));
printf("ReadStatus  <%d>\n",read(fd,cDE,deSize));

printf("current Key/Data <%d/%s>\n",cDE->key,cDE->data);

此外,如果您想知道,这里是 dE 结构:

struct dE {
    int key;
    char data[DataSize];
};

打印出来:

reading values at 1072
SeekStatus <1072>
ReadStatus  <32>
current Key/Data <27/old>

writing new values
SeekStatus  <1072>
WriteStatus <32>

re-reading values at 1072
SeekStatus <1072>
ReadStatus  <32>
current Key/Data <27/old>

【问题讨论】:

  • read((*fd).fd,cDE,deSize); 是否编译干净?此外,要取消引用指针,请使用-&gt;,即cDE-&gt;key
  • 您从未设置变量offsetdeSize 的值,因此它们可能是任何值。您永远不会检查 readwritelseek 的返回值。您需要发布代码的条带化可编译版本,以证明您遇到的问题或您提出的问题。 90% 的情况下,创建可编译示例的练习将为您解答问题。
  • 你对目录和文件有权限吗?
  • 我怀疑(*cDE).data = //something new 没有做你想做的事——你可能需要strncpy
  • 原谅我,我还是 StackOverflow 的新手,想出一个简洁的查询并不是我自然而然的事情。我用输出更新了我的代码。此处的所有内容都已编译,并且我稍微清理了格式。

标签: c file-io stdio


【解决方案1】:

open 调用中删除|O_APPEND

【讨论】:

  • 做到了!这是一个巨大的疏忽......来自'O_APPEND'下的'man 2 open':“在每次写入(2)之前,文件偏移量位于文件末尾,就像使用lseek(2)一样”
猜你喜欢
  • 2015-07-21
  • 2016-03-07
  • 2021-07-21
  • 1970-01-01
  • 2016-03-06
  • 1970-01-01
  • 2020-09-16
  • 1970-01-01
  • 2023-02-24
相关资源
最近更新 更多