符合中小企业对网站设计、功能常规化式的企业展示型网站建设
本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...
商城网站建设因基本功能的需求不同费用上面也有很大的差别...
手机微信网站开发、微信官网、微信商城网站...
#include stdio.h
召陵ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!
int hangshu(char file[])//输入工程目录下的文件名,或者其他目录下绝对路径名例如:c:\\1.txt;
{
char c;
int h=0;
FILE *fp;
fp=fopen(file,"r");
if(fp==NULL)
return -1;//表示文件打开错误
while((c=fgetc(fp))!=EOF)
{
if(c=='\n')
h++;
else
{
c=fgetc(fp);//这是处理最后一行可能没有换行标志,但是确文件结束。
if(c==EOF)
{
h++;
break;
}
}
}
return h;
}
int main()
{
int hs=hangshu("c:\\1.txt");//这里说明你要打开的文件。这个是c盘根目录下文件
int hst=hangshu("1.txt");//工程目录下的文件。
printf("行数:%d\n",hs);
printf("行数:%d\n",hs);
}
如上是用c编写的,不是c++.
运行的时候可以把中文注释去掉。
完全可以运行的,我已经测试过了。
1、用fgets函数可以读取文件中某行的数据,某列数据就必须一个一个读入每行的第几个字符,再存入到一个字符串当中。
2、例程:
#includestdio.h
#includestring.h
void main()
{
char a[100],b[100],c[100];
int i=3,j=4,k=0; //第三行,第四列
FILE *fp = fopen("data.txt","r");
while(fgets(c,100,fp)){ //读入每行数据
i--;
if(i==0) strcpy(a,c); //读到第三行数据
b[k++]=c[j-1]; //把每行的那列字符拷到b中
}
b[k]=0;
printf("第%d行数据:%s\n",i,a);
printf("第%d列数据:%s\n",j,b);
fclose(fp);
}
读取文件行数, 可以逐个字符读取文件,到文件尾,统计\n的个数
参考代码如下
#include stdio.h
int main()
{
int c;
FILE *fp;
int lines=0;
fp=fopen("in.txt", "rb");
if(fp)
{
while((c=fgetc(fp)) != EOF)
if(c=='\n') lines++;
printf("%d\n",lines);
fclose(fp);
}
return 0;
}
也可以通过fgets函数,每次读取一行,到文件尾,然后计算读取的次数
#include stdio.h
#include string.h
int main()
{
char s[100];
FILE *fp;
int lines=0;
fp=fopen("in.txt", "r");
if(fp)
{
while((fgets(s,100,fp)) != NULL)
if(s[strlen(s)-1]=='\n') lines++;
printf("%d\n",lines);
fclose(fp);
}
return 0;
}
代码中有两个问题:
(1)while(){}语法问题。
while(条件)/////这后面不能加分号,加分号后将做空循环,循环里不会执行循环体的代码
{
循环体;
}
把while()后面的分号";"去掉就好。
(2)while里面的条件(c=fgetc(fp) !=EOF) 有问题。按照C语言运算符的优先级将按以下顺序执行这个while循环里面的语句:
1) 读取文件: fgetc(fp)
2) 将读取文件的结果与EOF比较: fgetc(fp) !=EOF
3) 将比较的结果赋值给c,就是说c每次得到的不是true(1)就是false(0),根本不是你想要的结果
这个表达式其实是:while (c = (fgetc(fp) != EOF) )
正确的写法是:while ( (c = fgetc(fp)) != EOF)
所以最后的代码修改如下:
#includestdio.h
main()
{
FILE *fp;
char name[100],c;
int i;
int count = 0;//计算文件中字符个数,从而判断是否为空文件
i=0;//这边为什么初始化为1?如果输入的是空文件那么应该就是0行
printf("enter filename:");
gets(name);
fp=fopen( name ,"r");
if (fp != NULL)
while ( (c=fgetc(fp)) != EOF )
{
count ++;
if(c == '\n')
i++;
}
if(i == 0 count 0) i ++; //如果没有'\n'但是文件非空,那么该文件只有一行
printf("number of numbers:%d\n",i);
}
当然,仅仅判断'\n'并不保险,并不是所有系统下面的换行都有'\n',比如dos系统是"\r\n", linux系统一般用'\n',苹果系统用的是'\r',如果是苹果系统这种做法就失效了。
很遗憾,事实上计算机是不可能做到读取txt文件的第n行的时间复杂度为O(1)的。
因为txt文件是“顺序存储”,如图参考自《数据结构》
要读取第n行,必须找到第n-1行 = 则必须找到n-2行 … 必须找到第1行。所以读取第5000行的字符串,只能一行一行找,就好比人类看书,要看到第5000段( txt的第5000行 其实打印出来是第5000段)必须一段一段数,不然只能估计,就不准确了。
如果要以O(1)时间复杂度定位到第N“行”或第N个记录,必须用“索引存储”、“散列存储”等,如数据库文件会用这类存储。具体细节可以学《数据结构》、《数据库原理》等。
参考代码:
#include stdio.h
//读取filename文件(路径)、第 whichLine+1 行文本。
char * ReadSpeacialLine(char *filename, int whichLine)
{
FILE *fp;
int currentLine = 0; //当前读取的行
char strLine[1024]; //每行最大读取的字符数,可根据实际情况扩大
if ((fp = fopen(filename, "r")) == NULL) //判断文件是否存在及可读
{
printf("error!");
return NULL;
}
while (!feof(fp))
{
if (currentLine == whichLine)
{
fgets(strLine, 1024, fp); //读取一行
//printf("%s", strLine); //输出
return strLine;
}
fgets(strLine, 1024, fp); //读取一行,并定位到下一行
currentLine++;
}
fclose(fp); //关闭文件
return NULL;
}
int main() {
//注意 源代码里字符串写"\\",编译之后只是1个\,因为\是转义符号
char txtFile[] = "E:\\新建文本文档.txt";
int i = 11;
printf("第%d行\n%s", i+1
, ReadSpeacialLine(txtFile, i)); //ReadSpeacialLine返回的字符串里自带换行
getchar(); //防止结束闪退
return 0;
}