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

时间:2011-09-01 13:07:11

标签: c++ fwrite

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

#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <fcntl.h>
#include <string>
#include <share.h>
#include <sys\stat.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: %d\n",ferror(pDesfFile));

   fclose (pDesfFile);

  return 0;
}

您可以制作主文件并尝试查看它是否适合您 谢谢

6 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

fwrite的第三个参数是sizeof(缓冲区),它是4个字节(一个指针)。您需要传入要写入的字节数(lSize)。

更新:看起来你错过了表明文件应该是读/写的标志:_O_RDWR

这对我有用......

   std::string szdes = "C:\\temp\\test_des.txt"; 
   FILE* pDesfFile; 
   int iFileId2;
   err = _sopen_s(&iFileId2, szdes.c_str(), _O_CREAT|_O_BINARY|_O_RDWR, _SH_DENYNO, _S_IREAD | _S_IWRITE); 
   if (iFileId2 >= 0)  
      pDesfFile = _fdopen(iFileId2, "w+"); 

   size_t f = fwrite (buffer , 1, lSize, pDesfFile ); 
   fclose (pDesfFile); 

答案 2 :(得分:1)

由于我无法找到有关_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成功与否,你都会在顶部做同样的事情,你处理read(和write):(

答案 3 :(得分:1)

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

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: %d\n",ferror(pDesfFile));

          fclose (pDesfFile);
        }
      }
    }
  }

  return 0;
}

[编辑]

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

#include <stdio.h>

int main (int argc, char **argv) {
   FILE *fp = fopen ("f.kdt", "w+");

   printf ("wrote %d\n", fwrite ("asdf", 4, 1, fp));

   fclose (fp);
}

[/编辑]

答案 4 :(得分:0)

您使用的是C和C ++的混合体。这令人困惑。 sizeof运算符不会按预期执行。

答案 5 :(得分:0)

看起来@PJL@jschroedl发现了真正的问题,但总的来说:

fwrite州的文档:

  

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

因此,如果返回值小于传递的计数,请使用ferror查看发生的情况。

  

ferror例程(作为函数和宏实现)测试与流相关的文件上的读取或写入错误。如果发生错误,流的错误指示器将保持设置,直到流关闭或重绕,或者直到调用清除器为止。