C++ fwrite 不写入文本文件,不知道为什么?
C++ fwrite doesn't write to text file, have no idea why?
我有这段代码,基本上是从文件中读取并创建新文件,并将内容从源文件写入目标文件。它读取缓冲区并创建文件,但是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。
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 我不知道为什么这段代码会让核心被转储?
- 反转字符串.不知道为什么这个逻辑是错误的.C++
- 没有函数模板的实例与我不知道为什么的参数列表匹配
- if-else 语句仅按特定顺序工作,我不知道为什么
- DirectX 11 引擎在第三次代码改进后没有突然运行,我不知道为什么
- 函数抛出seg错误,我不知道为什么
- 我不知道为什么复制构造函数的调用在 c++ 中不稳定
- 随着时间的推移,我的程序越来越慢,我不知道为什么.内存泄漏
- 分段故障(核心转储)-不知道为什么
- "错误:在'.标记'之前出现预期的主表达式,我不知道为什么
- 我正在制作c ++代码,但发生错误我不知道为什么
- std::cout << glGetString(GL_RENDER) << std::endl;抛出错误但不GL_Renderer或GL_Verision,我不知道为什么?
- 不知道为什么它不会停止循环
- 我的Arduino串行命令行不起作用,我不知道为什么
- 我正在编写一个拆分为 3 的合并排序,我不知道为什么它不起作用
- C++单例模式代码无法运行,不知道为什么?
- 我不知道为什么我的矢量无法推回
- 罗马数字输出C++总是"-858993460",不知道为什么?
- 合成错误不知道为什么会发生这种情况,请检查一下并告诉我这是我的编码还是视觉工作室