首页 > 旅游见闻提升知识

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。