例如:一个程序不断的写入a.txt,
内容为a,a,a,a,a,
b,b,b,b,b,
c,c,c,c,c,
........
如何实现在不断的读取a.txt的同时(因为a.txt在不断的增长)将a.txt的内容不断的写入b.txt中!
我知道说明白了没,请高手赐教!谢谢!
25 个解决方案
#1
不断是有一定时间间隔么?可以定一下时
#2
定时把a.txt复制成b.txt不是就可以了吗
#3
回复:lzp229(只想飞)
您说的有道理!但如何候记录本次读到位置,下次接着读呢?请附代码,以便和您学习谢谢!
您说的有道理!但如何候记录本次读到位置,下次接着读呢?请附代码,以便和您学习谢谢!
#4
回复: javaman8(javaman)
不是那样简单的!因为在读取a.txt的同时不但要写入b.txt中,还要对读取的数据有其它操作!但这些操作在这个问题中就省略了。
不是那样简单的!因为在读取a.txt的同时不但要写入b.txt中,还要对读取的数据有其它操作!但这些操作在这个问题中就省略了。
#5
可以学习文件分割~~可以看看我的blog写了一个文件分割的东西~~
只要不同是读写一个地址就好
只要不同是读写一个地址就好
#6
定时可以在循环中加sleep,停几秒。
记录本次位置还没想好。小弟出学,一起等高手吧。
记录本次位置还没想好。小弟出学,一起等高手吧。
#7
回复: OpenHero(雨流星)
请问您的blog地址是多少?谢谢
请问您的blog地址是多少?谢谢
#8
回复:lzp229(只想飞)
您的“定时”建议,我也想到了sleep,呵呵。我想这个问题对一部分朋友,都是有帮助的
您的“定时”建议,我也想到了sleep,呵呵。我想这个问题对一部分朋友,都是有帮助的
#9
文件操作不怎么会奥。没做过。:) 学习
#10
学习
#11
mark一下。
#12
用另一个文件记录上次读到第几行,读文件时从上次读取位置开始接着读,也就是加一个计数器.这样可以吗?
#13
用C语不行吧,,一个正在增长的文件肯定有一个线程在对它进行写,,而你想写一个程序再去读他,,OS肯定不充许,,至少微软那些老家伙是不会让你这样做的.
我以前见有人写过这样的程序,,用C语言写的程序会发生冲突,,他最后用windows的脚本写了个程序,,最后可以实现,,具体怎么写的我就不得而知了.
我以前见有人写过这样的程序,,用C语言写的程序会发生冲突,,他最后用windows的脚本写了个程序,,最后可以实现,,具体怎么写的我就不得而知了.
#14
回复:xuezhi2000(一路走过)
在linux上执行
在linux上执行
#15
标准c当中没有提供共享方式打开文件的操作
也就是说,标准c函数当中对文件的操作的过程当中,其他程序是不能再对它进行访问的,无论读还是写
VC的CFile类才支持,它用CFile::shareDenyNone 属性打开那个不断增长的文件是可行的
也就是说,标准c函数当中对文件的操作的过程当中,其他程序是不能再对它进行访问的,无论读还是写
VC的CFile类才支持,它用CFile::shareDenyNone 属性打开那个不断增长的文件是可行的
#16
如果是同一个程序,打开两个不同的文件,对于a文件不断写入,对于b是从a当中读取,并且写入是可以的
#17
回复:NKNM(no knowledge no money)
您能不能写个例程,谢谢
您能不能写个例程,谢谢
#18
回复: happy__888([顾问团]寻开心)
不是同一个程序!这个程序只是要求不断的读取一个不断增长的文件a.tat,并同时写入另一个文件b.txt中
不是同一个程序!这个程序只是要求不断的读取一个不断增长的文件a.tat,并同时写入另一个文件b.txt中
#19
不太好弄吧,死循环会不会
#20
这里关键是对一个由别的程序打开的文件进行读操作,下面给出两个例子,两种方法:
用CreateFile函数实现的一个例子:
CString FileNameStr = "c:\\a.txt";
hFile = CreateFile(str, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN, NULL);
FILE_SHARE_READ | FILE_SHARE_WRITE 允许共享方式读一个已经打开的文件并且进行读写操作
用CFile的例子:
//example for CFile::CFile
char* pFileName = "c:\\a.txt";
TRY
{
CFile f( pFileName, CFile::modeCreate | CFile::modeWrite|CFile::shareDenyNone | CFile::typeText );
}
CATCH( CFileException, e )
{
#ifdef _DEBUG
afxDump << "File could not be opened " << e->m_cause << "\n";
#endif
}
END_CATCH
用CreateFile函数实现的一个例子:
CString FileNameStr = "c:\\a.txt";
hFile = CreateFile(str, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN, NULL);
FILE_SHARE_READ | FILE_SHARE_WRITE 允许共享方式读一个已经打开的文件并且进行读写操作
用CFile的例子:
//example for CFile::CFile
char* pFileName = "c:\\a.txt";
TRY
{
CFile f( pFileName, CFile::modeCreate | CFile::modeWrite|CFile::shareDenyNone | CFile::typeText );
}
CATCH( CFileException, e )
{
#ifdef _DEBUG
afxDump << "File could not be opened " << e->m_cause << "\n";
#endif
}
END_CATCH
#21
#include "stdio.h"
int main()
{
FILE *fp;
char str[1024];
if ( (fp=fopen("a.txt","w")) == NULL )
{
printf("fopen a.txt error!");
return -1;
}
memset(str,0x00,sizeof(str));
strcpy(str,"a");
while(1)
{
printf("%s\n",str);
fprintf(fp,"%s\n",str);
sleep(1);
fflush(fp);
}
fclose(fp);
return 0;
}
#include "stdio.h"
main()
{
FILE *fp1;
FILE *fp2;
char str_cmd[1024];
char str_tmp[1024];
if((fp1=fopen("b.txt","w")) == NULL)
{
printf("fopen b.txt error!\n");
return -1;
}
memset(str_cmd,0x00,sizeof(str_cmd));
strcpy(str_cmd,"tail -f a.txt");
if((fp2=popen(str_cmd,"r")) == NULL)
{
printf("fopen b.txt error!\n");
return -1;
}
while(1)
{
memset(str_tmp,0x00,sizeof(str_tmp));
if ( fgets(str_tmp,sizeof(str_tmp),fp2) != NULL )
{
printf("str_tmp = <%s>\n",str_tmp);
fprintf(fp1,"%s",str_tmp);
sleep(1);
fflush(fp1);
}
else
{
printf("sleep \n");
sleep(1);
continue;
}
}
fclose(fp1);
pclose(fp2);
}
简单的模式,
需要改造,加几个信号就好了。
int main()
{
FILE *fp;
char str[1024];
if ( (fp=fopen("a.txt","w")) == NULL )
{
printf("fopen a.txt error!");
return -1;
}
memset(str,0x00,sizeof(str));
strcpy(str,"a");
while(1)
{
printf("%s\n",str);
fprintf(fp,"%s\n",str);
sleep(1);
fflush(fp);
}
fclose(fp);
return 0;
}
#include "stdio.h"
main()
{
FILE *fp1;
FILE *fp2;
char str_cmd[1024];
char str_tmp[1024];
if((fp1=fopen("b.txt","w")) == NULL)
{
printf("fopen b.txt error!\n");
return -1;
}
memset(str_cmd,0x00,sizeof(str_cmd));
strcpy(str_cmd,"tail -f a.txt");
if((fp2=popen(str_cmd,"r")) == NULL)
{
printf("fopen b.txt error!\n");
return -1;
}
while(1)
{
memset(str_tmp,0x00,sizeof(str_tmp));
if ( fgets(str_tmp,sizeof(str_tmp),fp2) != NULL )
{
printf("str_tmp = <%s>\n",str_tmp);
fprintf(fp1,"%s",str_tmp);
sleep(1);
fflush(fp1);
}
else
{
printf("sleep \n");
sleep(1);
continue;
}
}
fclose(fp1);
pclose(fp2);
}
简单的模式,
需要改造,加几个信号就好了。
#22
回复:wuwen19(按时打发)
谢谢您的例程!有个问题:在实际中,如果a.txt的增长停止了(在实际应用中也许a.txt的增长速度很可能不如被读取的速度快!),您的b程序sleep一秒后又会重新从开头读取a.txt。如果忽略掉已经读取的部分,只读取新增加的部分,请问您,如何修改呢?谢谢!
谢谢您的例程!有个问题:在实际中,如果a.txt的增长停止了(在实际应用中也许a.txt的增长速度很可能不如被读取的速度快!),您的b程序sleep一秒后又会重新从开头读取a.txt。如果忽略掉已经读取的部分,只读取新增加的部分,请问您,如何修改呢?谢谢!
#23
也就是说a.txt增长的速度不是匀速的!
#24
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
main()
{
int a,b;
int c,t = 0;
int i;
int nsl = 0;
char buf[1024];
a = open("x", O_RDONLY);
b = open("xxx", O_WRONLY|O_APPEND|O_CREAT);
while (1)
{
c = read(a, buf, 3);
printf("read bytes: %d\n", c);
t += c;
if (c == 0)
{
nsl++;
if (nsl > 3)
break;
sleep(10);
a = open("x", O_RDONLY);
lseek(a, t, SEEK_SET); }
else
write(b, buf, c);
}
}
#25
ding
#1
不断是有一定时间间隔么?可以定一下时
#2
定时把a.txt复制成b.txt不是就可以了吗
#3
回复:lzp229(只想飞)
您说的有道理!但如何候记录本次读到位置,下次接着读呢?请附代码,以便和您学习谢谢!
您说的有道理!但如何候记录本次读到位置,下次接着读呢?请附代码,以便和您学习谢谢!
#4
回复: javaman8(javaman)
不是那样简单的!因为在读取a.txt的同时不但要写入b.txt中,还要对读取的数据有其它操作!但这些操作在这个问题中就省略了。
不是那样简单的!因为在读取a.txt的同时不但要写入b.txt中,还要对读取的数据有其它操作!但这些操作在这个问题中就省略了。
#5
可以学习文件分割~~可以看看我的blog写了一个文件分割的东西~~
只要不同是读写一个地址就好
只要不同是读写一个地址就好
#6
定时可以在循环中加sleep,停几秒。
记录本次位置还没想好。小弟出学,一起等高手吧。
记录本次位置还没想好。小弟出学,一起等高手吧。
#7
回复: OpenHero(雨流星)
请问您的blog地址是多少?谢谢
请问您的blog地址是多少?谢谢
#8
回复:lzp229(只想飞)
您的“定时”建议,我也想到了sleep,呵呵。我想这个问题对一部分朋友,都是有帮助的
您的“定时”建议,我也想到了sleep,呵呵。我想这个问题对一部分朋友,都是有帮助的
#9
文件操作不怎么会奥。没做过。:) 学习
#10
学习
#11
mark一下。
#12
用另一个文件记录上次读到第几行,读文件时从上次读取位置开始接着读,也就是加一个计数器.这样可以吗?
#13
用C语不行吧,,一个正在增长的文件肯定有一个线程在对它进行写,,而你想写一个程序再去读他,,OS肯定不充许,,至少微软那些老家伙是不会让你这样做的.
我以前见有人写过这样的程序,,用C语言写的程序会发生冲突,,他最后用windows的脚本写了个程序,,最后可以实现,,具体怎么写的我就不得而知了.
我以前见有人写过这样的程序,,用C语言写的程序会发生冲突,,他最后用windows的脚本写了个程序,,最后可以实现,,具体怎么写的我就不得而知了.
#14
回复:xuezhi2000(一路走过)
在linux上执行
在linux上执行
#15
标准c当中没有提供共享方式打开文件的操作
也就是说,标准c函数当中对文件的操作的过程当中,其他程序是不能再对它进行访问的,无论读还是写
VC的CFile类才支持,它用CFile::shareDenyNone 属性打开那个不断增长的文件是可行的
也就是说,标准c函数当中对文件的操作的过程当中,其他程序是不能再对它进行访问的,无论读还是写
VC的CFile类才支持,它用CFile::shareDenyNone 属性打开那个不断增长的文件是可行的
#16
如果是同一个程序,打开两个不同的文件,对于a文件不断写入,对于b是从a当中读取,并且写入是可以的
#17
回复:NKNM(no knowledge no money)
您能不能写个例程,谢谢
您能不能写个例程,谢谢
#18
回复: happy__888([顾问团]寻开心)
不是同一个程序!这个程序只是要求不断的读取一个不断增长的文件a.tat,并同时写入另一个文件b.txt中
不是同一个程序!这个程序只是要求不断的读取一个不断增长的文件a.tat,并同时写入另一个文件b.txt中
#19
不太好弄吧,死循环会不会
#20
这里关键是对一个由别的程序打开的文件进行读操作,下面给出两个例子,两种方法:
用CreateFile函数实现的一个例子:
CString FileNameStr = "c:\\a.txt";
hFile = CreateFile(str, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN, NULL);
FILE_SHARE_READ | FILE_SHARE_WRITE 允许共享方式读一个已经打开的文件并且进行读写操作
用CFile的例子:
//example for CFile::CFile
char* pFileName = "c:\\a.txt";
TRY
{
CFile f( pFileName, CFile::modeCreate | CFile::modeWrite|CFile::shareDenyNone | CFile::typeText );
}
CATCH( CFileException, e )
{
#ifdef _DEBUG
afxDump << "File could not be opened " << e->m_cause << "\n";
#endif
}
END_CATCH
用CreateFile函数实现的一个例子:
CString FileNameStr = "c:\\a.txt";
hFile = CreateFile(str, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN, NULL);
FILE_SHARE_READ | FILE_SHARE_WRITE 允许共享方式读一个已经打开的文件并且进行读写操作
用CFile的例子:
//example for CFile::CFile
char* pFileName = "c:\\a.txt";
TRY
{
CFile f( pFileName, CFile::modeCreate | CFile::modeWrite|CFile::shareDenyNone | CFile::typeText );
}
CATCH( CFileException, e )
{
#ifdef _DEBUG
afxDump << "File could not be opened " << e->m_cause << "\n";
#endif
}
END_CATCH
#21
#include "stdio.h"
int main()
{
FILE *fp;
char str[1024];
if ( (fp=fopen("a.txt","w")) == NULL )
{
printf("fopen a.txt error!");
return -1;
}
memset(str,0x00,sizeof(str));
strcpy(str,"a");
while(1)
{
printf("%s\n",str);
fprintf(fp,"%s\n",str);
sleep(1);
fflush(fp);
}
fclose(fp);
return 0;
}
#include "stdio.h"
main()
{
FILE *fp1;
FILE *fp2;
char str_cmd[1024];
char str_tmp[1024];
if((fp1=fopen("b.txt","w")) == NULL)
{
printf("fopen b.txt error!\n");
return -1;
}
memset(str_cmd,0x00,sizeof(str_cmd));
strcpy(str_cmd,"tail -f a.txt");
if((fp2=popen(str_cmd,"r")) == NULL)
{
printf("fopen b.txt error!\n");
return -1;
}
while(1)
{
memset(str_tmp,0x00,sizeof(str_tmp));
if ( fgets(str_tmp,sizeof(str_tmp),fp2) != NULL )
{
printf("str_tmp = <%s>\n",str_tmp);
fprintf(fp1,"%s",str_tmp);
sleep(1);
fflush(fp1);
}
else
{
printf("sleep \n");
sleep(1);
continue;
}
}
fclose(fp1);
pclose(fp2);
}
简单的模式,
需要改造,加几个信号就好了。
int main()
{
FILE *fp;
char str[1024];
if ( (fp=fopen("a.txt","w")) == NULL )
{
printf("fopen a.txt error!");
return -1;
}
memset(str,0x00,sizeof(str));
strcpy(str,"a");
while(1)
{
printf("%s\n",str);
fprintf(fp,"%s\n",str);
sleep(1);
fflush(fp);
}
fclose(fp);
return 0;
}
#include "stdio.h"
main()
{
FILE *fp1;
FILE *fp2;
char str_cmd[1024];
char str_tmp[1024];
if((fp1=fopen("b.txt","w")) == NULL)
{
printf("fopen b.txt error!\n");
return -1;
}
memset(str_cmd,0x00,sizeof(str_cmd));
strcpy(str_cmd,"tail -f a.txt");
if((fp2=popen(str_cmd,"r")) == NULL)
{
printf("fopen b.txt error!\n");
return -1;
}
while(1)
{
memset(str_tmp,0x00,sizeof(str_tmp));
if ( fgets(str_tmp,sizeof(str_tmp),fp2) != NULL )
{
printf("str_tmp = <%s>\n",str_tmp);
fprintf(fp1,"%s",str_tmp);
sleep(1);
fflush(fp1);
}
else
{
printf("sleep \n");
sleep(1);
continue;
}
}
fclose(fp1);
pclose(fp2);
}
简单的模式,
需要改造,加几个信号就好了。
#22
回复:wuwen19(按时打发)
谢谢您的例程!有个问题:在实际中,如果a.txt的增长停止了(在实际应用中也许a.txt的增长速度很可能不如被读取的速度快!),您的b程序sleep一秒后又会重新从开头读取a.txt。如果忽略掉已经读取的部分,只读取新增加的部分,请问您,如何修改呢?谢谢!
谢谢您的例程!有个问题:在实际中,如果a.txt的增长停止了(在实际应用中也许a.txt的增长速度很可能不如被读取的速度快!),您的b程序sleep一秒后又会重新从开头读取a.txt。如果忽略掉已经读取的部分,只读取新增加的部分,请问您,如何修改呢?谢谢!
#23
也就是说a.txt增长的速度不是匀速的!
#24
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
main()
{
int a,b;
int c,t = 0;
int i;
int nsl = 0;
char buf[1024];
a = open("x", O_RDONLY);
b = open("xxx", O_WRONLY|O_APPEND|O_CREAT);
while (1)
{
c = read(a, buf, 3);
printf("read bytes: %d\n", c);
t += c;
if (c == 0)
{
nsl++;
if (nsl > 3)
break;
sleep(10);
a = open("x", O_RDONLY);
lseek(a, t, SEEK_SET); }
else
write(b, buf, c);
}
}
#25
ding