C++ fwrite 不写入文本文件,不知道为什么?

C++ fwrite doesn't write to text file, have no idea why?

本文关键字:不知道 为什么 文件 文本 fwrite C++      更新时间:2023-10-16

我有这段代码,基本上是从文件中读取并创建新文件,并将内容从源文件写入目标文件。它读取缓冲区并创建文件,但是fwrite
不把内容写入新创建的文件,我不知道为什么。
下面是代码。(我只能对_sopen使用这个,它是遗留代码的一部分)

#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <fcntl.h>
#include <string>
#include <share.h>
#include <sysstat.h>

int main () {
  std::string szSource = "H:\cpp\test1.txt";
  FILE* pfFile;
  int iFileId = _sopen(szSource.c_str(),_O_RDONLY, _SH_DENYNO, _S_IREAD);
  if (iFileId >= 0) 
     pfFile = fdopen(iFileId, "r");
   //read file content to buffer 
   char * buffer;
   size_t result;
   long lSize;
   // obtain file size:
   fseek (pfFile , 0 , SEEK_END);
   lSize = ftell (pfFile);
   fseek(pfFile, 0, SEEK_SET);
 //   buffer = (char*) malloc (sizeof(char)*lSize);
   buffer = (char*) malloc (sizeof(char)*lSize);
   if (buffer == NULL)
   {
       return false;
   }
   // copy the file into the buffer:
   result = fread (buffer,lSize,1,pfFile);   
   std::string szdes = "H:\cpp\test_des.txt";
   FILE* pDesfFile;
   int iFileId2 = _sopen(szdes.c_str(),_O_CREAT,_SH_DENYNO,_S_IREAD | _S_IWRITE);
  if (iFileId2 >= 0) 
     pDesfFile = fdopen(iFileId2, "w+");
   size_t f = fwrite (buffer , 1, sizeof(buffer),pDesfFile );
   printf("Error code: %dn",ferror(pDesfFile));
   fclose (pDesfFile);
  return 0;
}

你可以创建main文件并尝试它是否为你工作。
由于

将代码更改为以下内容,然后报告结果:

int main () {
  std::string szSource = "H:\cpp\test1.txt";
  int iFileId = _sopen(szSource.c_str(),_O_RDONLY, _SH_DENYNO, _S_IREAD);
  if (iFileId >= 0) 
  {
    FILE* pfFile;
    if ((pfFile = fdopen(iFileId, "r")) != (FILE *)NULL)
    {
      //read file content to buffer 
      char * buffer;
      size_t result;
      long lSize;
      // obtain file size:
      fseek (pfFile , 0 , SEEK_END);
      lSize = ftell (pfFile);
      fseek(pfFile, 0, SEEK_SET);
      if ((buffer = (char*) malloc (lSize)) == NULL)
        return false;
      // copy the file into the buffer:
      result = fread (buffer,(size_t)lSize,1,pfFile);   
      fclose(pfFile);
      std::string szdes = "H:\cpp\test_des.txt";
      FILE* pDesfFile;
      int iFileId2 = _sopen(szdes.c_str(),_O_CREAT,_SH_DENYNO,_S_IREAD | _S_IWRITE);
      if (iFileId2 >= 0) 
      {
        if ((pDesfFile = fdopen(iFileId2, "w+")) != (FILE *)NULL)
        {
          size_t f = fwrite (buffer, (size_t)lSize, 1, pDesfFile);
          printf ("elements written <%d>n", f);
          if (f == 0)
            printf("Error code: %dn",ferror(pDesfFile));
          fclose (pDesfFile);
        }
      }
    }
  }
  return 0;
}

[编辑]

用于其他海报,以显示fwrite的使用/结果-下面的输出是什么?

#include <stdio.h>
int main (int argc, char **argv) {
   FILE *fp = fopen ("f.kdt", "w+");
   printf ("wrote %dn", fwrite ("asdf", 4, 1, fp));
   fclose (fp);
}
(/编辑)

sizeof(buffer)是指针的大小,即4,而不是缓冲区中的项数

如果buffer是一个数组,那么sizeof(buffer)可能会工作,因为它返回数组中的字节数。

fwrite的第三个参数是sizeof(buffer),大小为4字节(指针)。您需要传入要写入的字节数(lSize)。

更新:它看起来也像你错过了标志,指示文件应该是读/写:_O_RDWR

这是为我工作…

<>之前std::string szdes = "C:\temp\test_des.txt";文件* pDesfFile;int iFileId2;err = _sopen_s(&iFileId2, szdes.c_str(), _o_create |_O_BINARY|_O_RDWR, _SH_DENYNO, _S_IREAD | _S_IWRITE);if (iFileId2>= 0)pDesfFile = _fdopen(iFileId2, "w+");f = fwrite (buffer, 1, lSize, pDesfFile);文件关闭(pDesfFile);

因为我找不到关于_sopen的信息,我只能看man open。它报道:

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

你的呼叫_sopen(szdes.c_str(),_O_CREAT,_SH_DENYNO,_S_IREAD | _S_IWRITE);与其中任何一个都不匹配,你似乎有标志和"某些东西"和模式/什么是SH_DENY?

man _sopen的结果是什么?

最后,在关闭文件指针之后,不应该关闭_sopen中的文件描述符吗?

你的最后几行应该是这样的,顺便说一句:

if (iFileId2 >= 0) 
{
  pDesfFile = fdopen(iFileId2, "w+");
  size_t f = fwrite (buffer , 1, sizeof(buffer),pDesfFile ); //<-- the f returns me 4
  fclose (pDesfFile);
}

因为无论O_CREAT之后的fdopen是否成功,当前都在写入文件。在顶部也做同样的事情,不管RDONLY文件的fdopen是否成功,都要处理读(和写)操作:(

您正在使用C和c++的混合。这很令人困惑。

看起来@PJL和@jschroedl发现了真正的问题,但也一般:

fwrite状态的文档:

fwrite返回实际写入的完整条目数,如果发生错误,可能小于count。此外,如果发生错误,则无法确定文件位置指示符。

因此,如果返回值小于传递的计数,则使用error来查明发生了什么。

error例程(既作为函数实现,也作为宏实现)测试与流相关的文件上的读或写错误。如果发生错误,则流的错误指示器保持设置,直到流关闭或重绕,或者直到对其调用clearerr。

相关文章: