菜鸟求助各位大神!

battleining 2012-07-26 10:54:12
关于文件操作的问题,假如txt里面内容:
i am boy!
i am girl!
.
.
.


n多行数据,怎样提前计算行数,当然假如是固定行数的 我能设立数组然后分行导入,但是一旦数据多了,我怎样提前预知行数,然后设置合适的数组,以免空间浪费,菜鸟级水平,忘大家给予指点 谢谢。
...全文
175 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ies_sweet 2012-07-27
  • 打赏
  • 举报
回复
如何得到行数的问题,楼上很多老师已经总结了
要么在文件开始处标记,要么就是遍历统计

关于楼主要通过数组来存放每行字符串的问题,我这里有点担心
每行字符串的长度差别大吗?如果有很长的字符串,那数组的空间规模很可观的
内存上的考虑可能要多一些

不知道楼主要实现什么样的应用,是否有必要一次性的将文件内容读出?
能不能把应用背景说一下,也许可以找到更好的实现方式
  • 打赏
  • 举报
回复
1.在文件头设置一个关于函数的记录。
2.自己先遍历一遍文件,算出行数

建议用1
赵4老师 2012-07-27
  • 打赏
  • 举报
回复
仅供参考
#include <stdio.h>
#include <string.h>
#define MAXLEN 1000
char ln[MAXLEN];
FILE *f;
int i,z;
int b,n,L;
int main(int argc,char **argv) {
if (argc<2) {
printf("Usage:%s fullpathfilename.ext\nget total blank/non-blank/total linenumbers.\n",argv[0]);
return 1;
}
f=fopen(argv[1],"r");
if (NULL==f) {
printf("Can not open file [%s]!\n",argv[1]);
return 2;
}
z=0;
b=0;
n=0;
L=0;
while (1) {
if (NULL==fgets(ln,MAXLEN,f)) break;
L=strlen(ln);
if ('\n'==ln[L-1]) {
if (0==z) {
for (i=0;i<L-1;i++) {
if (!(' '==ln[i] || '\t'==ln[i])) break;
}
if (i<L-1) z=1;//当前行不是空行
}
if (0==z) b++; else n++;
z=0;
} else {
if (0==z) {
for (i=0;i<L;i++) {
if (!(' '==ln[i] || '\t'==ln[i])) break;
}
if (i<L) z=1;//当前行不是空行
}
}
}
fclose(f);
if (L>0 && '\n'!=ln[L-1]) {
if (0==z) b++; else n++;//最后一行末尾无'\n'也计算
}
printf("File:[%s] total blank/non-blank/total linenumbers is %d/%d/%d\n",argv[1],b,n,b+n);
return 0;
}
shen_wei 2012-07-27
  • 打赏
  • 举报
回复
遍历文件以 \n 来判断是不是一行!
lx3275852 2012-07-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

1. 先遍历一遍文件。
2. 或者在写文件的时候,在第一行指出行数。
[/Quote]

写文件时,文件的第一行标明行数+1
BeckyLu 2012-07-27
  • 打赏
  • 举报
回复
您好,我是这样想的。测试环境是linux,用shell脚本来读取文档的行数。合适的数组大小我没有想出来,不行就根据所得的行数malloc吧。 如果有更好的方法也告诉我下,我也是菜鸟一枚。

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

int main(void)
{
int ret = 0;
int line = 0;
FILE *fd = NULL;
char buff[1024];

/*需要读取的文件为test.txt*/
ret = system("wc -l test.txt > test.txt.bak");

fd = fopen("/home/xxx/test.txt", "r");
if (NULL == fd)
return -1;

if ( fgets(buff, 1024, fd) == NULL )
return -1;

sscanf(buff, "%d", &line);
printf("line = %d\n", line);

fclose(fd);
return 0;
}
自信男孩 2012-07-27
  • 打赏
  • 举报
回复
可以考虑先遍历以下文件,计算出文件中的行数;
也可以通过边遍历边度去再边申请空间(在对堆上使用malloc申请);
SillyBenzhu 2012-07-27
  • 打赏
  • 举报
回复
亲爱的,建议参考fgets的用法。我回答问题从来用输出结果说话,下面是我的执行过程,结果和源代码。如果喜欢就给分吧
root@zhushengben-desktop:/home/zhushengben/Desktop/test# gcc -o main main.c
root@zhushengben-desktop:/home/zhushengben/Desktop/test# ./main main.c
There are 20 lines in the file main.c


#include<stdio.h>
#include<stdlib.h>
#define true 1
#define false 0


int main (int argc ,char *argv[])
{
int line;
char buffer[80];
FILE *fp = fopen(argv[1], "r");//读取文件

while(fgets(buffer, sizeof(buffer), fp)){//取一行.客官请多多注意fgets的特殊用法!
line++;
}
line--;

printf("There are %d lines in the file %s \n",line,argv[1]);
}
huangdancs 2012-07-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

1.在文件头设置一个关于函数的记录。
2.自己先遍历一遍文件,算出行数

建议用1
[/Quote]

我觉得两个思路都挺好:
思路1,给出了一个很好的设计数据思路。
思路2,则能解决楼主的问题。

楼主想直接在定义数组的时候初始化大小。我只能想到:先遍历文件获取行数来解决。
期待有好的解决方法。
battleining 2012-07-26
  • 打赏
  • 举报
回复
1. 先遍历一遍文件。---这个真不知道咋弄 能否再提示一下 谢谢
2. 或者在写文件的时候,在第一行指出行数。--这个如果提供的话 我会操作的
南气子水 2012-07-26
  • 打赏
  • 举报
回复
行数是以换行符分隔?貌似文本文件中换行符会转换为换行和回车
pathuang68 2012-07-26
  • 打赏
  • 举报
回复
1. 先遍历一遍文件。
2. 或者在写文件的时候,在第一行指出行数。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧