请问strncpy、memcpy、substring函数的参数有没有长度限制?

cuonacuo 2007-09-12 05:18:55
我有一个文件文件几十万行、每一行将近2000,
使用strncpy运行就会出错,我把文档减为5万行,一切都正常。

大伙有谁知道的吗?先谢谢了


我的程序:
(我把写文件部分省略掉了,写起来太长)
(程序执行到strncpy(RowStr,buf,len); 就会出错)

void __fastcall TMainForm::Button1Click(TObject *Sender)
{
TStruK TStru;
Init_TStruk(&TStru);
char ZipName[80],FileName[80],CmdStr[200],TmpStr[200],OutFile[80];
char *RowStr;
AnsiString WorkPath,RecoStr;
if(Edit1->Text==""){
Application->MessageBox("请输入数据日期!","提示信息",MB_ICONASTERISK);
return ;
}
WorkPath=GetCurrentDir();
sprintf(ZipName,"%s\\data\\%s_TStru.zip",WorkPath,Edit1->Text);
sprintf(FileName,"dwert.txt");

if(access(ZipName, 0)!=0){
Application->MessageBox("数据文件不存在,请确认!","提示信息",MB_ICONASTERISK);
return ;
}

sprintf(OutFile,"test.txt");


sprintf(TmpStr,"开始解压文件:[%s]",FileName);
RichEdit1->Lines->Add(AnsiString(TmpStr));
sprintf(CmdStr,"unzip.exe -j -o %s %s\\at01\\%s",ZipName,Edit1->Text,FileName);
if (system(CmdStr)!=0){
Application->MessageBox("解压文件失败,请检查!","提示信息",MB_ICONASTERISK);
RichEdit1->Lines->Add(AnsiString(CmdStr));
return ;
};
sprintf(TmpStr,"解压[%s]成功!",FileName);
RichEdit1->Lines->Add(AnsiString(TmpStr));

if((fpo=fopen(OutFile,"w+"))==NULL){
sprintf(TmpStr,"生成文件失败[%s],请检查!",OutFile);
RichEdit1->Lines->Add(AnsiString(TmpStr));
exit(0);
}


HANDLE hFile = CreateFile(FileName, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("创建文件对象失败,错误代码:%d ", GetLastError());
return;
}


HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
if (hFileMap == NULL)
{
printf("创建文件映射对象失败,错误代码:%d ", GetLastError());
return;
}


// 得到系统分配粒度
SYSTEM_INFO SysInfo;
GetSystemInfo(&SysInfo);
DWORD dwGran = SysInfo.dwAllocationGranularity;
// 得到文件尺寸
DWORD dwFileSizeHigh;
__int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh);
qwFileSize |= (((__int64)dwFileSizeHigh) << 32);
// 关闭文件对象
CloseHandle(hFile);
// 偏移地址
__int64 qwFileOffset = 0;
// 块大小
DWORD dwBlockBytes = 1000 * dwGran;

if (qwFileSize < 1000 * dwGran)
dwBlockBytes = (DWORD)qwFileSize;
if (qwFileOffset >= 0)
{
TCHAR *lpbMapAddress = (TCHAR *)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS,
0, 0,
dwBlockBytes);
if (lpbMapAddress == NULL)
{
printf("映射文件映射失败,错误代码:%d ", GetLastError());
return;
}


// 对映射的视图进行访问
DWORD i = 0;

const char* buf = lpbMapAddress;
const char* start = lpbMapAddress;
int count=0;
int len;
while(start != NULL){
start = _get_line(buf, &len);
count++;
strncpy(RowStr,buf,len);

sscanf(RowStr,"%5s%5s%22s%1s%6s%61s%60s%60s%30s%19s\
%3s%10s%10s%30s%23s%23s%23s%23s%23s%23s\
%23s%30s%23s%23s%23s%23s%23s%23s%23s%5s\
%5s%19s%16s%40s%29s%29s%29s%23s%23s%23s\
%23s%23s%23s%23s%19s%23s%19s%23s%19s%23s\
%19s%23s%23s%23s%23s%23s%19s%23s%23s%23s\
%23s%22s%60s%30s%121s%121s%1s%10s%1s%66s\
%66s%9s%9s",
TStru.str1,TStru.str2,TStru.str3,TStru.str4,TStru.str5,TStru.str6,TStru.str7,
TStru.str8,TStru.str9,TStru.str10,TStru.str11,TStru.str12,TStru.str13,TStru.str14,
TStru.str15,TStru.str16,TStru.str17,TStru.str18,TStru.str19,TStru.str20,TStru.str21,
TStru.str22,TStru.str23,TStru.str24,TStru.str25,TStru.str26,TStru.str27,
TStru.str28,TStru.str29,TStru.str30,TStru.str31,TStru.str32,TStru.str33,TStru.str34,
TStru.str35,TStru.str36,TStru.str37,TStru.str39,TStru.str40,
TStru.str41,TStru.str42,TStru.str43,TStru.str44,TStru.str45,TStru.str46,
TStru.str47,TStru.str48,TStru.str49,TStru.str50,TStru.str51,TStru.str52,
TStru.str53,TStru.str54,TStru.str55,TStru.str56,TStru.str57,
TStru.str58,TStru.str59,TStru.str60,TStru.str61,TStru.str62,TStru.str63,
TStru.str64,TStru.str65,TStru.str66,TStru.str67,TStru.str68,TStru.str69,TStru.str70,
TStru.str71,TStru.str72,TStru.str73,TStru.str74
);

/* 写dwert.txt文件部分 */

buf = start;
}

// 撤销文件映像
UnmapViewOfFile(lpbMapAddress);
}
// 关闭文件映射对象句柄
CloseHandle(hFileMap);

Application->MessageBox("处理结束","提示信息",MB_ICONASTERISK);
}


const char* _get_line(const char* buf, int* len){
const char* tmp = buf;
while(*tmp && *tmp != 0x0d && *tmp != 0x0a){
++tmp;
}
*len = tmp - buf;
if (*tmp == 0) return NULL;
if (*tmp == 0x0d){
++tmp;
assert(*tmp == 0x0a);
++tmp;
return tmp;
}
...全文
535 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cuonacuo 2007-09-15
  • 打赏
  • 举报
回复
哪位大哥有知道的吗?
我把c++里边的截取函数基本都试过了,
还是没找到答案,真是急啊
cuonacuo 2007-09-13
  • 打赏
  • 举报
回复

请问哪里的sprintf 用 _scprintf ?
flypig_007 2007-09-13
  • 打赏
  • 举报
回复
sprintf这个有限制1024
_scprintf 用这个
cuonacuo 2007-09-12
  • 打赏
  • 举报
回复
用malloc先去分配我也试过,还是同样的错误,

我的机器是4G的内存,应该不会有这样的问题
cczlp 2007-09-12
  • 打赏
  • 举报
回复
strncpy(RowStr,buf,len);
我怎么没有看到 RowStr 是在哪分配内存的.
i_love_pc 2007-09-12
  • 打赏
  • 举报
回复
是不是应该在内存允许的范围之内。。。
内容概要:本文系统研究了在强弱电网适配场景下,构网型(GFM)与跟网型(GFL)逆变器并联系统的协同控制逻辑及其暂态动态行为,重点依托Simulink仿真平台构建混合并网系统模型,深入分析两类逆变器在不同电网强度条件下的交互特性、频率响应机制、稳定性表现及抗扰能力。研究涵盖分层控制架构设计、异构控制策略对比、频率扰动响应规律以及多工况暂态性能评估,探讨了GFM与GFL逆变器在功率支撑、电压频率调节和系统稳定性方面的互补性与协同机制,旨在提升高比例新能源接入背景下并网系统的适应性、鲁棒性与动态性能。; 适合人群:具备电力电子、新能源并网、自动控制或电力系统仿真等相关专业知识背景,从事新型电力系统控制、微电网运行、逆变器控制策略研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入理解构网型与跟网型逆变器在强弱电网中的协同工作机理与动态交互特性;②掌握异构逆变器并联系统的建模方法、协同控制策略设计与暂态仿真分析流程;③为高渗透率新能源系统的稳定性分析、控制优化及工程应用提供理论依据和技术参考。; 阅读建议:建议结合Simulink仿真实例进行动手实践,重点关注控制策略的实现细节、参数整定方法及多工况仿真结果的动态响应分析,同时可参考文中提及的相关博士论文复现案例以深化对理论机制的理解。

684

社区成员

发帖
与我相关
我的任务
社区描述
智能路由器通常具有独立的操作系统,包括OpenWRT、eCos、VxWorks等,可以由用户自行安装各种应用,实现网络和设备的智能化管理。
linuxpython 技术论坛(原bbs)
社区管理员
  • 智能路由器社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧