writefile(writelines)
writefile 多线程写多文件 该如何做
下面的程序,编译之后,你可以运行很多个实例,目前我将文件写在了D:\1.txt,每个程序写1000行数据,这些值你可以自己更改(比如写在C:,每个程序写10000行等),等程序都写完后,你可以去文件中查看写文件的结果。补充一下,我是在VC6.0环境中写的,所以windows.h,如果你不是在这个环境中的话,可能需要修改一些定义,比如DWORD等。其他的API都是windows平台提供的API;
#include<stdio.h>
#include”windows.h”
int main()
{
//获取进程ID,因为你希望是多个进程运行同时写一个文件,所以,我们打印出进程ID
DWORD dwProcessID= GetCurrentProcessId();
//初始化我们要写入文件中的内容,及该内容长度;
char szContent[100]={0};
sprintf(szContent,”process[%u] write file\r\n”,dwProcessID);
DWORD dwContentLen= strlen(szContent);
//创建互斥量,这样可以进行进程间的互斥,当然用这个也可以做线程间的互斥
HANDLE hMutex= CreateMutex(NULL,FALSE,”MyFileMutex”);
if(NULL== hMutex)
{
printf(“[%u]Create/Open Mutex error!\r\n”,dwProcessID);
return 1;
}
//创建或打开文件
HANDLE hFile= CreateFile(“D:\\1.txt”,
GENERIC_READ| GENERIC_WRITE,
FILE_SHARE_WRITE| FILE_SHARE_READ,NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_ARCHIVE,
NULL);
if(INVALID_HANDLE_VALUE== hFile)
{
printf(“[%u]Creat/Open file error!\r\n”,dwProcessID);
return 1;
}
//循环写入文件
for(int i= 0; i< 1000; i++)
{
//等待临界资源,即锁定文件
WaitForSingleObject(hMutex,INFINITE);
printf(“Process[%u] Get the signal\r\n”,dwProcessID);
DWORD len= 0;
//因为是共享写文件,即多个程序写一个文件,所以一定要将文件指针偏移到尾部
SetFilePointer(hFile,0,NULL,FILE_END);
//写入文件
BOOL rnt= WriteFile(hFile,szContent,dwContentLen,&len,NULL);
if(rnt== FALSE)
{
printf(“Process[%u] Fail to write file\r\n”,dwProcessID);
}
//释放互斥量,解除锁定
ReleaseMutex(hMutex);
//加个Sleep便于我们中间观察结果
Sleep(30);
}
CloseHandle(hMutex);
CloseHandle(hFile);
return 0;
}
应你要求,我把AIP中的宏定义解释如下:
HANDLE hFile= CreateFile(“D:\\1.txt”,
GENERIC_READ| GENERIC_WRITE,//表示程序对该文件有读和写的权限
FILE_SHARE_WRITE| FILE_SHARE_READ,//表示可以多个程序共享读和写的权限
NULL,
OPEN_ALWAYS,//表示打开该文件,如果该文件不存在,则创建该文件
FILE_ATTRIBUTE_ARCHIVE,//文件的属性为存档
NULL);
WaitForSingleObject(hMutex,INFINITE);
//INFINITE表示永远等待,直到hMutex有信号为止
SetFilePointer(hFile,0,NULL,FILE_END);
//FILE_END表示从文件尾部开始偏移;实际此举就是将文件指针偏移到文件尾部;
请教c++写文件WriteFile问题!!!
你写文件的模式是文本文件模式吧,你将文件以二进制模式写入试试.
你是在研究压缩算法?具学以NULL存成的文件,可以无限压缩,1G大小的NULL文件也能压缩到几K字节.
如果你只想写入一个字节,写一个字母了行呀
二进制文件的写入模式最精确,不过文件名的扩展名,最好不要用.txt,起个别的名吧.
——————–
我用的是C/C++/MFC的文件系统,它们都有二进制,文本的打开方式.
你用的是API文件系统,应该不分二进制还是文体文件.实际上,二进制文件,文本文件,存盘时都是二进制文件.区别嘛,我是这么想的:文本文件,存盘前,对要存盘的数据是按字符型数据存的.比如说,你要存一个整型数值1,存时你加了个'1'引号,1就变成了1+48=49.否则你将引号去掉试试,除非你按49存,否则,文本打开后不是1.所以我认为c++/C/MFC的所谓文本文件,就是存前要求用引号或双引号括起来,或者是函数自动的将它们括起来.
我学得Win32API函数有点象汇编语言,MFC象Basic语言.也就是说,API不能算是高级语言吧.你还是了解一下就成,不要太认真了!C/C++/MFC哪一个都比API方便!最重要的一点,你是在学VC,不是在学API!
API不属于VC/C/C++,它是所有window编程语言的基础!是开发VC软件的人来研究的!你将它当成汇编语言了解一下就成了.
求助高人:串口WriteFile出错
不关你事的,这里它本身的bug,发送某个特定字符时会出错(具体哪个我忘了,你用穷举一个一个试吧),换成真正的双机连接就不会了(不过有可能会出现其它错误,软件模拟的毕竟与实际还是有点不同的)
我的解决方法是将该字符进行替换
另外,我试过一次发送多个字符,里面包含该字符时也没错,不知为什么
出了错不用重启电脑的,重置串口就行了
——————————————–
你的串口连接线有没有问题?有debug的io命令试一下
——————————————–
你的端口是以异步读写打开的还是同步?
如果是异步的话if(!dwWrite&&(GetLastError()==ERROR_IO_PENDING))
这里会出现个小问题,dwWrite可能永远为假
另外,检查一下send里面的内容,看看里面发送的内容是否正确
——————————————–
这里我写端口的作法
hch_Write.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if(!WriteFile(comhandle, outbuff, *,&towrite,&hch_Write))
{
//HCH_TEST;
if(GetLastError()==ERROR_IO_PENDING)
//GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读写*作
{
//INFINITE
WaitForSingleObject(hch_Write.hEvent, 5000);
//使用WaitForSingleObject函数等待,直到写*作完成或延时已达到5秒钟
PurgeComm(comhandle, PURGE_TXABORT|PURGE_TXCLEAR);
——————————————–
参考资料是串口调试助手的源代码
为什么我的writefile写入文件的数据是乱码
这个不是你程序的问题,是Windows记事本的Bug,因为程序输出的某些字符触发了这个bug,记事本把文件当成unicode编码处理,结果乱码。
把这句
ofile<<a[i]<<“”;
换了一下顺序改成
ofile<<“”<<a[i];
就不会乱码了。
记事本这样的bug很多,
比如记事本新建一个文本,打开以后输入:联通这两个字,保存,关闭记事本。再打开,你看看变成什么了?
有一个开玩笑的说法是因为*联通把微软*得罪了……
记事本保存的时候,默认使用ansi编码
但是用ansi编码呢,联通这两个字的开头正好是:fffe…..这样的,于是再打开呢,他就以为是utf-8编码了,但是按照utf-8来解码呢,却造成乱码了
如何使用WriteFile将数据写到文件末尾
方法1:用append模式打开文件,然后写入数据
方法2:用读写模式打开,使文件指针移动到文件末尾,然后写入数据
方法3:用读模式打开文件,用写和建立模式打开新文件,读取原文件内容,写入新文件,再将新文件中追加写入新的数据,将原文件改名为备份文件名,将新文件改名为原文件名
本文链接:http://www.wmyx8.com/html/87964165.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。