C语言字符串 按行读取

我有一个小程序对“参数”文件内的5行数据进行读取,然后输出的“输出”文件中,以下程序能够完成此目的,但我现在想在评断的下一行的数字1变为空格,也就是什么都没有,只保留空行,下边的程序就完成不了了,请问,我该如何做,能原样输出“参数”中的空格行等内容?
参数txt文件入了:
个数
330
评断
1
成功
现改为:
个数
330
评断

成功

#include<stdio.h>
int main()
{int e=0;
char pjk[80]={0},pj[80]={0},fk[80]={0},dd[80]={0};
FILE *fc,*fp;
fc=fopen("参数.txt","r");
fp=fopen("输出.txt","w");

fscanf(fc,"%s",dd);
fscanf(fc,"%d",&e);
fscanf(fc,"%s",pjk);
fscanf(fc,"%s",pj);
fscanf(fc,"%s",fk);

fprintf(fp,"%s\n",dd);
fprintf(fp,"%d\n",e);
fprintf(fp,"%s\n",pjk);
fprintf(fp,"%s\n",pj);
fprintf(fp,"%s\n",fk);

fclose(fc);
fclose(fp);
}

#include<stdio.h>
#include<stdlib.h>
#include <string.h>
int main()
{
int e=0;
char pjk[80]={0},pj[80]={0},fk[80]={0},dd[80]={0};
FILE *fc,*fp;
char *psz;//[100]={0};
int len=0;
int i=0;
int j=0;
int index[5]={0};
fc=fopen("参数.txt","rb");
fp=fopen("输出.txt","wb");

fseek(fc,0L,SEEK_END);
len=ftell(fc);//得到文件长度
fseek(fc,0L,SEEK_SET);
psz=(char*)malloc(len+1);//申请内存
memset(psz,0x00,len+1);
fread(psz,len,sizeof(char),fc);//读全部文件到内存
for (i=0;i<len;i++)
{
if('\r'==psz[i])
{
psz[i]=0;//将字符串切割
}
else if ('\n'==psz[i])
{
j++;
psz[i]=0;//将字符串切割
index[j]=i+1;//获取每一行开头索引
}
else
{
dd[i]=psz[i];
}
}

strcpy(dd,psz+index[0]);
e=atoi(psz+index[1]);
strcpy(pjk,psz+index[2]);
strcpy(pj,psz+index[3]);
strcpy(fk,psz+index[4]);
free(psz);//释放内存

fprintf(fp,"%s\r\n",dd);
fprintf(fp,"%d\r\n",e);
fprintf(fp,"%s\r\n",pjk);
fprintf(fp,"%s\r\n",pj);
fprintf(fp,"%s\r\n",fk);

fclose(fc);
fclose(fp);
}追问

您好,用您的程序可以实现我的目的,但多数有点高深,能多做点解释吗,还有,最希望您能在我的基础上做些改动就好,因为我这程序很大,动多了,很复杂,谢谢

追答

你的程序我尽可能少的改动,我改动的只是从文件中读取文件到变量中的这部分。你原来的方式是用C语言自带的fscanf实现,这个函数和scanf一样,有弱点。

我的思想是这样的。

    首先得到文件的大小,根绝文件大小申请一块内存空间,将整个文件一次性读进来,这样就得到了一个包含全部内容的大字符串。

    然后将每行的回车符和换行符改成字符串结束符。同时记下每一行的开始位置。这样一个长字符串就被按行断成了多个子字符串。

    然后按行将内容复制到你之前定义的变量中。如果是字符串类型的,直接拷贝内容,如果是数值类型的,调用函数转换下。别的就没改了。

追问

嗯,您的思想我了解了,谢谢您

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-07-25
写了个代码,希望采纳,等分哦。这个代码还有问题,比如比较字符串后面还有多个6,比如一行数据多余1024,这些需要你自己动手实现。
记住把文件的绝对路径改成你自己的,我是在linux下写的。
#include <stdio.h>#include <string.h>#define bool int#define false 0#define true 1#define MAX_NUM 1025int main(int argc,char **argv){ /*fileSrc是查找文件的绝对路径*/ const char *fileSrc = "/home/xxx/workspace/c/xxx.text"; /*fileSave是找到合适字符串后保存文件的绝对路径*/ const char *fileSave = "/home/xxx/workspace/c/aaa.text"; const char *flagString = "66666"; FILE *fp_src = NULL,*fp_save; char buf[MAX_NUM] = {0}; bool flag = false; fp_src = fopen(fileSrc,"r"); if(fp_src == NULL) return -1; while(fgets(buf,sizeof(buf),fp_src) != NULL) { printf("buf= %s",buf); if(flag == true) { fp_save = fopen(fileSave,"w+"); if(fp_save == NULL) { return -1; } fwrite(buf,1,sizeof(buf)-1,fp_save); fclose(fp_save); break; } if(0 == memcmp(buf,flagString,strlen(flagString))) { flag = true; } memset(buf,0,sizeof(buf)); } fclose(fp_src); return 0;}
是否可以解决您的问题?
相似回答