高分请教能不能用c实现,不断的读取一个不断增长的文件,并同时写入另一个文件中??谢谢 !

时间:2021-09-29 19:52:33
请教能不能用c实现,不断的读取一个不断增长的文件,并同时写入另一个文件中??谢谢 !
例如:一个程序不断的写入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中,还要对读取的数据有其它操作!但这些操作在这个问题中就省略了。

#5


可以学习文件分割~~可以看看我的blog写了一个文件分割的东西~~
只要不同是读写一个地址就好

#6


定时可以在循环中加sleep,停几秒。
记录本次位置还没想好。小弟出学,一起等高手吧。

#7


回复: OpenHero(雨流星) 
请问您的blog地址是多少?谢谢

#8


回复:lzp229(只想飞) 
您的“定时”建议,我也想到了sleep,呵呵。我想这个问题对一部分朋友,都是有帮助的

#9


文件操作不怎么会奥。没做过。:) 学习

#10


学习

#11


mark一下。

#12


用另一个文件记录上次读到第几行,读文件时从上次读取位置开始接着读,也就是加一个计数器.这样可以吗?

#13


用C语不行吧,,一个正在增长的文件肯定有一个线程在对它进行写,,而你想写一个程序再去读他,,OS肯定不充许,,至少微软那些老家伙是不会让你这样做的.

我以前见有人写过这样的程序,,用C语言写的程序会发生冲突,,他最后用windows的脚本写了个程序,,最后可以实现,,具体怎么写的我就不得而知了.

#14


回复:xuezhi2000(一路走过)
在linux上执行

#15


标准c当中没有提供共享方式打开文件的操作

也就是说,标准c函数当中对文件的操作的过程当中,其他程序是不能再对它进行访问的,无论读还是写

VC的CFile类才支持,它用CFile::shareDenyNone 属性打开那个不断增长的文件是可行的

#16


如果是同一个程序,打开两个不同的文件,对于a文件不断写入,对于b是从a当中读取,并且写入是可以的

#17


回复:NKNM(no knowledge no money)
您能不能写个例程,谢谢

#18


回复: happy__888([顾问团]寻开心) 
不是同一个程序!这个程序只是要求不断的读取一个不断增长的文件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

#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);
}


简单的模式,
需要改造,加几个信号就好了。

#22


回复:wuwen19(按时打发)
谢谢您的例程!有个问题:在实际中,如果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中,还要对读取的数据有其它操作!但这些操作在这个问题中就省略了。

#5


可以学习文件分割~~可以看看我的blog写了一个文件分割的东西~~
只要不同是读写一个地址就好

#6


定时可以在循环中加sleep,停几秒。
记录本次位置还没想好。小弟出学,一起等高手吧。

#7


回复: OpenHero(雨流星) 
请问您的blog地址是多少?谢谢

#8


回复:lzp229(只想飞) 
您的“定时”建议,我也想到了sleep,呵呵。我想这个问题对一部分朋友,都是有帮助的

#9


文件操作不怎么会奥。没做过。:) 学习

#10


学习

#11


mark一下。

#12


用另一个文件记录上次读到第几行,读文件时从上次读取位置开始接着读,也就是加一个计数器.这样可以吗?

#13


用C语不行吧,,一个正在增长的文件肯定有一个线程在对它进行写,,而你想写一个程序再去读他,,OS肯定不充许,,至少微软那些老家伙是不会让你这样做的.

我以前见有人写过这样的程序,,用C语言写的程序会发生冲突,,他最后用windows的脚本写了个程序,,最后可以实现,,具体怎么写的我就不得而知了.

#14


回复:xuezhi2000(一路走过)
在linux上执行

#15


标准c当中没有提供共享方式打开文件的操作

也就是说,标准c函数当中对文件的操作的过程当中,其他程序是不能再对它进行访问的,无论读还是写

VC的CFile类才支持,它用CFile::shareDenyNone 属性打开那个不断增长的文件是可行的

#16


如果是同一个程序,打开两个不同的文件,对于a文件不断写入,对于b是从a当中读取,并且写入是可以的

#17


回复:NKNM(no knowledge no money)
您能不能写个例程,谢谢

#18


回复: happy__888([顾问团]寻开心) 
不是同一个程序!这个程序只是要求不断的读取一个不断增长的文件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

#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);
}


简单的模式,
需要改造,加几个信号就好了。

#22


回复:wuwen19(按时打发)
谢谢您的例程!有个问题:在实际中,如果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