C语言从文件欲读入文本的文件号数据总是少一列

C语言读取文件数据最后一条重复了?怎么解决
[问题点数:20分,结帖人pzc]
本版专家分:0
结帖率 33.33%
CSDN今日推荐
本版专家分:79
结帖率 59.38%
本版专家分:12523
本版专家分:427
本版专家分:427
本版专家分:0
结帖率 33.33%
本版专家分:75
结帖率 100%
匿名用户不能发表回复!|
CSDN今日推荐当前位置:
&【分享】C语言中文件读取的一个小技巧
【分享】C语言中文件读取的一个小技巧
对于很多人来在用C语言时,文件读取总是有点麻烦。一方面是因为在使用scanf家族函数时都必须得使用固定格式的转换修饰符,稍不留心就写错了;另外一方面是很多计算程序的输出文件都非常大,经常都是几万行甚至更多,格式上比较烦。
& & 其实自己平时大多是写点脚本来处理数据。脚本语言是非常合适做这些事情的,很多时候都能很方便地使用awk+sed+bash或者直接使用perl来完成工作。但是有时希望更进行更多的处理和分析,这时就希望能使用C之类的来读入结算结果再处理一下。有时也希望能通过使用C来换取性能的提升(其实大部分时候直接使用脚本,稍加注意都能取得非常不错的效果的)。
& & 对于输出文件非常长的时候,如果使用脚本来处理,往往都可以使用tail、head、grep或者sed来提取我们需要的那部分。在使用C时其实我们可以利用fseek,ftell来定位或获取当前位置。对于比较大的文件,可以使用fseek(FILE *stream, long offset, int whence)来调整位置。如果我们知道自己需要的数据是在文件末尾,可以把末尾包含有需要的数据的那部分写到另外一个文件,然后查看其长度(ls -l输出的第5列)。利用fseek(stream,- offset,SEEK_END)来移动FILE指针所指向的存取位置。这样可以避免读取大量无用数据所耗的时间。在unix/linux下如果需要使用无缓冲的I/O函数需要掌握好open、creat、close、lseek、read、write等函数。对于目录操作则需要使用到chdir、fchdir、getcwd、mkdir、rmdir,unlink、remove等函数。manpages-dev里包含了对这些函数的详细说明,在使用man时需要指定手册卷数,比如 man 3 rmdir。
& &对于读取格式比较复杂的的文件一定要用好scanf中的前导星号(*)和[]。下图是我的结算输出文件
其实大多时候我只关心如41407行的第一数字,代表自恰循环的次数,和41408行后面的数字。
有时希望能随时查看当前循环了多少次,和当前的结果。每次循环输出的数据都有几十行,而且随着计算的对象不同而不同的。就抓住在这2行前的一个有一个特殊的#号。
所以可以在使用前1步的方法在对自己的输出文件进行分析后把读取位置定位到一个自己觉得比较合理的位置上,然后使用一个循环就读出最后一次循环的结果:
while ( fscanf(fp, &%*[^#]%*[#]%*[^\n]\n&) != EOF ) {
& && && && && && && && && && && && && && && && && && && & /*fscanf(fp, &%*[^#]%*[#]%*[^\n]\n&);
& && && && && && && && && && && && && && && && && && &  *充分利用%*来过滤掉所有
& && && && && && && && && && && && && && && && && && && &&&*不是#的字符以达到定位的目的.
& & & & & & & & & & & & & & & & & & & & & & & & & & & && &*/
& & & & fscanf(fp, &%d%*[^\n]\n&, &(ptd.iter)); /*读取需要的信息后换行*/
& & & & fscanf(fp, &%19c%lf%*[^\n]\n&, temp, &(ptd.energy));
就这样很简单的处理就可以读出结果,对于一些重复性工作而已有点意义吧。如果每次算的不多还是就别折腾这些了。
感谢yalefield 及时纠正错误!
[ Last edited by tjyl on
at 00:18 ]
24小时热帖
下载小木虫APP
与700万科研达人随时交流请问一下这个下面的C语言程序用scanf()函数从文件中读取数据是为什么读不出来呢?读出来的值都是0?
本回答由提问者推荐
var sogou_ad_id=731547;
var sogou_ad_height=160;
var sogou_ad_width=690;c语言读入数据为什么会出现段错误_百度知道
c语言读入数据为什么会出现段错误
数据文件中的数据有大约20万个时,运行时就会出现段错误,编译没问题。如果使用malloc函数的话,最多能读入多少数据,不考虑电脑内存什么的。
我有更好的答案
什么叫数据大约20万个?malloc是在堆里分配空间的,怎么是读入数据呢?
就是一个文本文件里有几十万几百万个数据,要把这些数据读入到一个数组里做运算。
根据我的经验,段错误一般是指针问题,还有malloc的时候,好像没听说过最多能分配多少空间,好像只要你的堆足够大,多少都是可以的!方便的话把代码列出来看看!如果你的文件数据不管多大都会段错误,那么这个就比较好检查了,你可以通过打印定位问题所在;如果你的文件数据超过了一定值后会出现断错误,那么有可能是溢出问题,可能你的指针指向了未知区域!
为您推荐:
其他类似问题
段错误的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。简单快乐,追求卓越
C语言读取文件大量数据到数组
针对.txt文档的大量有规律数据,譬如100行8列的数据将其读取到二维数组(矩阵)中,留作之后的数据处理。
改程序通过宏定义的方法来确定将要读取程序的行数和列数,将数据读取到二维数组data[100][8]中。
同时加入一个测试函数read(),功能是可以获取txt文档大量数据的行数,本项目中待定使用。
程序如下:
#include&stdio.h&
#include&stdlib.h&
为了以后特定行数的读取,采用宏定义的方法来确定行数
程序中read()读取该文件的行数,当未知文件行数时可使用返回值做全局变量
#define N 115
#define L 8
const char file_name[50] = "d:\\dat.txt";void read(FILE *fp)
int row=0;while(!feof(fp))
mid=fgetc(fp); //从txt文本中读取一个字符赋值给mid
if(mid=='\n') //如果这个字符为换行符
row++; //记录txt数据行数
//最后一行没有换行符
printf("行数为%d\n",row);
rewind(fp); //回文件起始位置
int main(int argc, char *argv[])
{FILE *double data[N][L] = {0.0};
//二维数组int index[N] = {0};
//二维数组行下标
int i,int count = 0;
//计数器,记录已读出的浮点数if((fp=fopen(file_name, "rb")) == NULL) {printf("请确认文件(%s)是否存在!\n", file_name);exit(1);}
//读取行数while(1==fscanf(fp, "%le", &temp)) //lf,le都可以,但别的都不可以,%e也不行{data[(index[count%L])++][count%L] =count++;}fclose(fp);
//关闭句柄/******处理数据****************/for(i=0;i&N;i++){
printf("第%d行数据:\n",i+1);for(j=0;j&L;j++){ printf("%5.3le ", data[i][j]);//.16f可以,le时以科学计数法显示}printf("\n");}return 0;
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 欲读入文本的文件号 的文章

 

随机推荐