当前位置: 代码迷 >> C语言 >> [求助]文件间的字符串存取码 --- 斑竹及各位高手再来看看啊!!!
  详细解决方案

[求助]文件间的字符串存取码 --- 斑竹及各位高手再来看看啊!!!

热度:446   发布时间:2006-05-24 07:44:00.0
[求助]文件间的字符串存取码 --- 斑竹及各位高手再来看看啊!!!
新手入门,望高手不吝赐教!

主要目的是读取eingabe.txt文件,根据条件创建文件ausgabe.txt
当遇到有这样一行出现时:#EINBAU datei1.txt
在这里插入datei1.txt里面的全部内容,其他行则直接复制eingabe.txt的内容到ausgabe.txt。

我自己写的代码如下,但是不能完成任务,已经研究了很久,也不知道是哪里出了问题,望高手指教!

--------------------------------------------------------------------------

#include <string.h>
#include <stdio.h>

void writeto(FILE *source,FILE *ziel){
char ch;
ch=fgetc(source);
while(ch!=EOF){
fputc(ch,ziel);
ch=fgetc(source);
}
}

int main(void)
{
char *p;
FILE *fpr,*fpi,*fpn;
char str[81],a[2][80];
int i = 0;

if((fpr=fopen("d:\\eingabe.txt","at+"))==NULL){
printf("\nCannot open file strike any key exit!");
getch();
exit(1);
}

if((fpn=fopen("d:\\ausgabe.txt","wt"))==NULL){
printf("\nCannot open file strike any key exit!");
getch();
exit(1);
}


while(feof(fpr)==0){

fgets(str,80,fpr);
p = strtok(str, " ");
if (p) strcpy(a[0],p);

p = strtok(NULL, " ");
if (p) strcpy(a[1],p);


if (a[0] == "#EINBAU\n"){

if((fpi=fopen("a[1]","rt"))==NULL){
printf("Cannot open file strike1 any key exit!");
getch();
exit(1);
}
writeto(fpi,fpn);
}
else
fputs(str,fpn);

}

fclose(fpr);
fclose(fpi);
fclose(fpn);

}

------------------------------------------------------------------------

eingabe.txt
------------------------------------------------------------------------
abcdefg hijklmn opq rst
uvw xyz
123 321
456
#EINBAU d:\\datei1.txt
7890 1234 567
345 678
1234567
ab cd efg
------------------------------------------------------------------------

datei1.txt
------------------------------------------------------------------------
qwertyu asdfghj xcvbn
swer werwe erer ewq
qwewq wqeqw rtrgf
fsdf sdfsdf
------------------------------------------------------------------------

[此贴子已经被作者于2006-5-25 8:20:29编辑过]

搜索更多相关的解决方案: 取码  字符  文件  斑竹  

----------------解决方案--------------------------------------------------------
呵呵,我一楼呀,不过我还没学到那里,先顶了!
----------------解决方案--------------------------------------------------------
好像还要支持你一下
----------------解决方案--------------------------------------------------------

对照看一下
[CODE]
#include "string.h"
#include "stdio.h"

void Writeto(FILE *source,FILE *fp)
{
char ch;

ch=fgetc(source);
while(ch!=EOF)
{
fputc(ch,fp);
ch=fgetc(source);
}
}

int main(void)
{
FILE *fpstr,*fpstr1,*fpstr2;
char str[81],ch,*p;
int i = 0;

if((fpstr=fopen("d:\\string.txt","rt"))==NULL)
{
printf("\nCan't open file strike any key exit!\n");
exit(-1);
}
if((fpstr1=fopen("d:\\string1.txt","rt"))==NULL)
{
printf("\nCan't open file strike1 any key exit!\n");
exit(-1);
}
if((fpstr2=fopen("d:\\string2.txt","wt"))==NULL)
{
printf("Can't open file strike2 any key exit!\n");
exit(-1);
}

while( !feof(fpstr) )
{
ch=getc(fpstr);
for(i=0;i<80&&ch!='\n'&&ch!=EOF;i++,ch=getc(fpstr))
str[i]=ch;
if(! strncmp(str,"#INSERT d:\\string1.txt",6))
Writeto(fpstr1,fpstr2);
else
{
str[i]=10;
str[i+1]='\0';
fputs(str,fpstr2);
}
str[0]='\0';
}

fclose(fpstr);
fclose(fpstr1);
fclose(fpstr2);

return 0;
}

[/CODE]


----------------解决方案--------------------------------------------------------

多谢斑竹的指点,问题已经解决了,多谢!多谢!不过这个程序还有第二个要求,就是替换功能:
比如说eingabe.txt的第10行是 #ERSATZ abc def , 那么从第11行开始所有的abc字段都要替换成的def,
接着如果第15行是 #ERSATZ ijk xyz , 那么从第16行开始所有的ijk字段都要替换成的xyz,遇到abc还要继续替换成def。
我的想法是,把刚才插入做好的文件打开,按行读入,按空格分成若干字符串,分别对比,基本上可以完成任务,不过还是有以下的问题出现,而无法解决:
1,原文件中如果有连续多个空格,则会被忽略,如果有空行,就是这一行只有一个回车,也会被忽略。
2,每行最后一个字符串不会对比,不知道为什么。
3,输出的时候,有些行第一个字符会多出个空格。

是不是我的基本思想就有问题?还是我的实现方法不好呢,请斑竹腾出点时间,再给指点一下!多谢多谢!

代码如下:

#include <string.h>
#include <stdio.h>

void writeto(FILE *source,FILE *ziel){
char ch;
ch=fgetc(source);
while(ch!=EOF){
fputc(ch,ziel);
ch=fgetc(source);
}
}

int main(void)
{
char *p;
FILE *fpr,*fpi,*fpn;
char str[81],stro[81],a[2][80],e[80][80],b[2][32][80];
int i, j, k, q = 0;

if((fpr=fopen("d:\\eingabe.txt","rt"))==NULL){
printf("\nCannot open file strike any key exit!");
getch();
exit(1);
}

if((fpn=fopen("d:\\temp.txt","wt"))==NULL){
printf("\nCannot open file strike any key exit!");
getch();
exit(1);
}


while(feof(fpr)==0){

fgets(str,80,fpr);
strcpy(stro,str);
p = strtok(str, " ");
if (p) strcpy(a[0],p);

p = strtok(NULL, " ");
if (p){
strtok(p, "\n");
strcpy(a[1],p);
}

if (strcmp(a[0],"#EINBAU") == 0){

if((fpi=fopen(a[1],"rt"))==NULL){
printf("Cannot open file strike1 any key exit!");
getch();
exit(1);
}
writeto(fpi,fpn);
}
else
fputs(stro,fpn);

}

fclose(fpr);
fclose(fpi);
fclose(fpn);


/* 这里以下开始第二个功能:替换 */


if((fpr=fopen("d:\\temp.txt","rt"))==NULL){
printf("\nOeffnen von temp.txt fehlgeschlagen.\n");
getch();
exit(1);
}

if((fpn=fopen("d:\\ausgabe.txt","wt"))==NULL){
printf("\nOeffnen von ausgabe.txt fehlgeschlagen.\n");
getch();
exit(1);
}

while(feof(fpr)==0){

fgets(str,80,fpr);
p = strtok(str, " ");
if (p) strcpy(e[0],p);

for (i = 1; i < 80; i++){
p = strtok(NULL, " ");
if (p)
strcpy(e[i],p);
else
break;
}

if (strcmp(e[0],"#ERSATZ") == 0){
strcpy(b[0][q],strtok(e[1],"\n"));
strcpy(b[1][q++],strtok(e[2],"\n"));
}
else{
for (j = 0; j < i; j++)
for (k = 0; k < q; k++)
if (strcmp(e[j],b[0][k]) == 0)
strcpy(e[j],b[1][k]);

fprintf(fpn,"%s ",e[0]);
for (j = 1; j < i; j++)
fprintf(fpn," %s",e[j]);
}
}

fclose(fpr);
fclose(fpn);
}


----------------解决方案--------------------------------------------------------
  相关解决方案