- NOJ 61# 源程序添加行号
卡了足足一个星期才开始做文件这一季的题目,真的是心累
直接上新学到的函数:
FILE * fopen(const char * path,const char * mode)
//int feof (FILE *stream) (用 while (fgets(s1,sizeof(s1)-1,fp) != NULL) 合并完成)
char *fgets(char * s, int n,FILE *stream);
int sprintf(char *buffer, const char *format, [argument]...)
int fputs(const char *str, FILE *stream)
附上完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *fp,*out;
int i=1;
char s1[100],s2[100];
fp=fopen("DATA5612.CPP","r");
if (fp != NULL) {
out=fopen("DATA5612.TXT","w");
while (fgets(s1,sizeof(s1)-1,fp) != NULL) {
sprintf(s2,"%04d %s",i++,s1);
fputs(s2,out);
}
}
fclose(fp);
fclose(out);
return 0;
}
fscanf位于头文件<stdio.h>中,函数原型为int fscanf(FILEstream, constcharformat, [argument…]); 其功能为根据数据格式(format)从输入流(stream)中写入数据(argument);与fgets的差别在于:fscanf遇到空格和换行时结束,注意空格时也结束,fgets遇到空格不结束。
- NOJ 62# 检测位图长宽
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp=fopen("DATA5611.BMP","rb");
long biWidth,biHeight;
if(fp!=NULL)
{
fseek(fp,18,SEEK_SET);
fread(&biWidth,sizeof(long),1,fp);
fread(&biHeight,sizeof(long),1,fp);
printf("%ld %ld",biWidth,biHeight);
fclose(fp);
}
return 0;
}
- NOJ 69# 单词频次
if (!strcmp(s,"if")) cnt1++; //若字符串数组s==“if”则计数器++
if (!strncmp(s+6,"JFIF",strlen("JFIF"))) cnt1++; //若从字符串数组s的第7个单元开始的长度为字符串“JFIF”的长度的字符串==“JFIF”则计数器++
由于两个函数比对成功均返回0,故注意取非!!!
char s[20]="";
while (fscanf(fp,"%s",s) != EOF) {
if (!strcmp(s,"if")) cnt1++;
if (!strcmp(s,"while")) cnt2++;
if (!strcmp(s,"for")) cnt3++;
}
开动脑筋思考一下,为什么忘了取非,最后结果会是“2 2 2”呢~
……
好吧扯了这么多结果PE了 /笑哭
经过胡大佬的指点,我发现我对题目的考虑不够周全。如果输入中出现
xxx if(%^# xxx
这样的情况,算不算出现了单词 if 呢?题目需要我把这样的前面或者后面没有空格的单词也算进去呀!(虽然我觉得题目的表述有点坑——出现"if",“while”,“for”【单词】的个数???)
OK,那正确方法应该是 j, j+1, j+2 这样的,完整代码如下:
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp=fopen("DATA5610.TXT","r");
int i=0,j=0,cnt1=0,cnt2=0,cnt3=0;
char s[1000][1000];
if (fp != NULL) {
while (fgets(s[i],999,fp) != NULL) {
for (j=0; j<1000; j++) {
if (s[i][j]=='i' && s[i][j+1]=='f') cnt1++;
if (s[i][j]=='w' && s[i][j+1]=='h' && s[i][j+2]=='i' && s[i][j+3]=='l' && s[i][j+4]=='e') cnt2++;
if (s[i][j]=='f' && s[i][j+1]=='o' && s[i][j+2]=='r') cnt3++;
}
i++;
}
}
fclose(fp);
printf("%d %d %d",cnt1,cnt2,cnt3);
return 0;
}
- NOJ 69# 单词频次