C语言读取记事本数据时最后一行数据被重复读出?怎么回事?

作者&投稿:舌狮 (若有异议请与网页底部的电邮联系)
C语言求助,怎么将记事本中的数据读取出来?~

#include
#include
#include
#define MAX_LINE 1024
int main()
{
char buf[MAX_LINE]; /*缓冲区*/
FILE *fp; /*文件指针*/
int len; /*行字符个数*/
if((fp = fopen("test.txt","r")) == NULL) /*如果读取失败*/
{
perror("fail to read");
exit (1) ;
}
while(fgets(buf,MAX_LINE,fp) != NULL) /*如果指针指到的行还有内容*/
{
len = strlen(buf);
buf[len-1] = '\0'; /*去掉换行符*/
printf("%s %d
",buf,len - 1); /*输出读取的内容*/
}
return 0;
}
希望能帮到你

if((fwrite(p,sizeof(struct part),1,fp))!=1)
其实你说的就是数据加密,看看下面这个代码#include
#include
void main()
{
FILE *fp;
if((fp = fopen("/mnt/sdcard/kk.txt","r"))==NULL)
{printf("wen jian bu cuan zai!");
exit (0);}
printf("dakai chenggong!
");
int i;
int n;
char str[1000];
for( i=0; i<1000&&!feof(fp); i++ )
{str[i] = fgetc(fp);
printf("%c",str[i]);}
str[i]='\0';
n = i;
fclose(fp);
for(i = 0; i < n; i++)
str[i] = str[i] - 32;这里就是算法加密,可以升级加密算法
str[i-1] = '\0';
FILE *qq,*gg;
/*qq=tmpfile();*/
char name[8];
tmpnam(name);
gets(name);
gg=fopen(name,"w");
for( i = 0; i < n; i++)
{fputc(str[i],gg);
printf("%c",str[i]);}
fclose(gg);
rename(name,"/mnt/sdcard/jia mi");
}
当然这个是原始的加密方式,你要读取的时候读取后+32即可。当然你可以升级算法,数学书上有讲过加密问题,貌似有种加密方式是无法破解的,总之都是算法加密

另外你可以用二进制方式写入数据,那样就会变成乱码,而你用sizeof计算结构体大小读取数据,就能起到加密的作用,应为别人不知道sizeof的大小

用feof,但必须记住:当文件刚刚读到文件尾时,feof不会返回true。只有在文件尾部再次进行一次读操作,feof才会返回真。
这与底层系统调用相关。因为只有read返回一次0值,进程才能知道文件结束了。

你可以将代码读取做如下修改
while(fscanf(fp,"%d%d%d%d",&rec.id,&rec.dtime.y,&rec.dtime.m,&rec.dtime.d))
{//如果不是文件尾
for(i=0;i<13;i++)
fscanf(fp,"%f",&rec.cost[i]);
printf("\t%d\t%d%d%d",rec.id,rec.dtime.y,rec.dtime.m,rec.dtime.d);//输出流水号和日期
for(i=0;i<13;i++)
printf("\t %.2f",rec.cost[i]); //输出各项费用
printf("\n");
}

你再试试。

#include <stdio.h>

typedef struct node
{
int value;
int weight;
struct node *next;
}linklist;

void Insert(linklist *head, int value, int weight)
{
linklist *rear, *s;

rear = head;
while (rear->value != value &&
rear->next)
{
rear = rear->next;
}

if (rear->value == value)
{
rear->weight += weight;
return;
}

s = new linklist();
s->value = value;
s->weight = weight;
s->next = rear->next;
rear->next = s;
}

void main()
{
linklist *head, *rear;
int value, weight;
FILE *fpIn, *fpOut;
char inFile[FILENAME_MAX], outFile[FILENAME_MAX];

printf("请输入原始数据文件路径:");
scanf("%s", inFile);
fpIn = fopen(inFile, "rt");
if (fpIn == NULL)
{
printf("打开文件'%s'失败,请检查文件是否存在", inFile);
getchar();
return;
}

printf("请输入新文件的名字:");
scanf("%s", outFile);
fpOut = fopen(outFile, "wt");

head = new linklist();
head->value = -1;
head->weight = -1;
head->next = NULL;
while (fscanf(fpIn, "(%d,%d)\n", &value, &weight) > 0)
{
Insert(head, value, weight);
}

fclose(fpIn);

rear = head->next;
while (rear)
{
fprintf(fpOut, "(%d,%d)\n", rear->value, rear->weight);
rear = rear->next;
}
fclose(fpOut);

printf("处理完毕!");
getchar();
}


你把 fscanf(fp,"%d%d%d%d",&rec.id,&rec.dtime.y,&rec.dtime.m,&rec.dtime.d);这句位置改成下面这样试试:

fscanf(fp,"%d%d%d%d",&rec.id,&rec.dtime.y,&rec.dtime.m,&rec.dtime.d);
while(feof(fp)==0)
{//如果不是文件尾
for(i=0;i<13;i++)
fscanf(fp,"%f",&rec.cost[i]);
printf("\t%d\t%d%d%d",rec.id,rec.dtime.y,rec.dtime.m,rec.dtime.d);//输出流水号和日期
for(i=0;i<13;i++)
printf("\t %.2f",rec.cost[i]); //输出各项费用
printf("\n");
fscanf(fp,"%d%d%d%d",&rec.id,&rec.dtime.y,&rec.dtime.m,&rec.dtime.d);
}

或者用 while(fgets(buffer,size,fp))

先读一次,然后判断是否文件尾又读一次


C语言对记事本的读取和写入
int nRow);\/\/参数:nRow:要读取几行RSTR *strBA(RSTR *rstrHeadA,RSTR *rstrHeadB);\/\/整合BA字符串,返回整合后链表首节点void meError(void *p);\/\/内存申请失败int main(){ FILE *fp; char filePath[]="c:\\\\list.txt"; RSTR *rstrHeadA=NULL,*rstrHeadB=NULL,*rstr...

C语言如何实现对记事本的读取和写入
include <stdio.h>#include <string.h>int fpread(){char a[1000] = {0};FILE *fp = fopen("C:\\\\Users\\\\Administrator\\\\Desktop\\\\1.txt", "r");if(NULL == fp){printf("failed to open dos.txt\\n");return 1;} while(!feof(fp)){memset(a, 0, sizeof(a));fgets(a, size...

C语言求助,怎么将记事本中的数据读取出来?
buf[len-1] = '\\0'; \/*去掉换行符*\/ printf("%s %d \\n",buf,len - 1); \/*输出读取的内容*\/ } return 0;} 希望能帮到你

C语言读取记事本数据时最后一行数据被重复读出?怎么回事?
用feof,但必须记住:当文件刚刚读到文件尾时,feof不会返回true。只有在文件尾部再次进行一次读操作,feof才会返回真。这与底层系统调用相关。因为只有read返回一次0值,进程才能知道文件结束了。你可以将代码读取做如下修改 while(fscanf(fp,"%d%d%d",&rec.id,&rec.dtime.y,&rec.dtime.m,&rec.d...

易语言读取记事本内容,保存到变量
.版本 2 .支持库 spec .程序集 窗口程序集1 .子程序 _按钮1_被单击 .局部变量 数组, 文本型, , "0".局部变量 a, 文本型 .局部变量 b, 文本型 .局部变量 c, 文本型 通用对话框1.打开 ()数组 = 分割文本 (到文本 (读入文件 (通用对话框1.文件名)), #换行符, )a = 数组 [1]...

如何易语言取记事本第一行内容
.子程序 __启动窗口_创建完毕 .局部变量 nr, 文本型 .局部变量 xz, 整数型 nr = 到文本 (读入文件 (“记事本TXT文件路径,如:D:\\1.txt”))xz = 寻找文本 (nr, 到文本 (#换行符), , 假)nr = 取文本左边 (nr, xz)信息框 (“第一行的内容为:” + #换行符 + nr, 0, )

易语言怎么读取记事本里的帐号跟密码,类似图片上的
使用文本分割命令

易语言编辑框如何读取同目录下的记事本txt文件里面的内容?
先创建个编辑框,代码:.子程序 __启动窗口_创建完毕 编辑框1.内容 = 到文本 (读入文件 (“txt文件地址”))

编程高手,怎么样将记事本中的内容直接用计算机语言调用到程序中?_百 ...
常见的语言都能做,只要不是DOS下的,因为实模式64K内存限制后很麻烦。把你的数据格式说清楚,需要读入到什么程序中,你会哪些语言,我给你写例子代码。补充:数据如果有统一格式,你贴几行就行了。那么大,我邮箱装不下。你的线路要怎样转换为0、1呢?

用易语言小程序 打卡txt记事本文件 或者bat批处理文件该怎么做呢_百...
.版本 2 .程序集 窗口程序集1 .子程序 _按钮1_被单击 编辑框1.内容 = 到文本 (读入文件 (“c:\\123.txt”))直接读入到编辑框里面了

耀州区15554366041: c#中如何读取文本文件的最后一行? -
源克胃好: 两种方法:1. 一行一行读,读到文件尾,你就知道哪行是最好一行了.可以考虑使用System.IO.File.ReadAllLines()方法,返回值是字符串数组. File.ReadAllLines 方法 (System.IO) https://msdn.microsoft.com/zh-cn/library/System.IO.File.ReadAllLines(v=vs.110).aspx 2. 从流的末尾一个字节一个字节往前读,读到换行符以后,再从这个位置读到文件结尾.

耀州区15554366041: C#如何读取TXT最后一行数据 -
源克胃好: string fn = @"C:\test.txt"; StreamReader sr = new StreamReader( fn ); string st = string.Empty; while ( !sr.EndOfStream ) { st = sr.ReadLine(); } // 这里的st就是最后一行了,

耀州区15554366041: c语言,从文本文件中读取数据到结构体数组,读不到最后一行是什么问题 -
源克胃好: 不是读不到,而是读完最后一行后,即跳出了循环,没有打印,所以,只需要在while(){}后面添加一行,如: ..... while(fgetc(fp)!=EOF) {printf("%d %d %s\n",eve[i].p,eve[i].d,eve[i].name); i++;fscanf(fp,"%d%d%s",&eve[i].p,&eve[i].d,&eve[...

耀州区15554366041: c语言中如何读取文本文件中每一行的数据 -
源克胃好: 用fstream(文件流),fstream file 然后 file.getline(char*,int,char a='\n')第一个是一个存储字符串的指针,第二个是要读取的最大长度,第三个是行结束符,默认是回车,函数说明就是当读入的字符超过最大长度int或者遇到行结束符('\n')时就停止,而且这个很好用的(对于读入和写入),你看看文档就会了,哈哈,给分啊.!!~~

耀州区15554366041: 如何读取文本文件的最后100行 -
源克胃好: 如果想自由地读取txt文档任意位置,就只能使用随机读写数据文件的方式来读与写的操作.因为C语言里的随机读写数据文件提供了 “文件位置标记”和定位的相关函数.例如: rewind函数使文件位置标记指向文件开头 fseek函数改变文件位置标记,其中该函数的原型为: fseek(文件类型指针,位移量,起始点);如果仅仅是想读取文件末尾一行数据,只需把起始点定位到文件末尾,位移量为负数代表向后挪的意思. 如: fseek(fp,-100L,SEEK_END); // 文件游标定位到文件末尾处,然后向后退100个字节. 紧接着就是读取了: fread(buffer,100,1,fp);

耀州区15554366041: 用c语言读取二进制文本,读到最后一行的标志是什么 -
源克胃好: 读到最后一行,没有任何标志 在程序中 只能判断出读完了最后一行 而且是在读到最后一个字符 再读一次,才会得到一个EOF的错误.根据函数不同,返回出错值也不同.出错后 feof(fp) 为1

耀州区15554366041: C语言如何 覆盖写入到文件最后一行 -
源克胃好: 覆盖写入最后一行还是比较麻烦的.因为判断最后一行的开始本身就不容易 新写入的数据如果比原本行更少,使用读写方式还会出现空洞 所以 最简单的方法就是把原本文件数据都读出来 然后以只写的方式 重新打开,清空文件 把之前的数据写入, 除了最后一行 最后 再写入新数据.

耀州区15554366041: c++如何读取txt的数据(一行一行的读,从第一行读到最后一行)要详细代码 -
源克胃好: C++读取txt文本数据并一行一行的读方法如下: 1、使用C++提供输入输出流的getline函数可以实现整行读取;完整代码如下: #include<iostream> #include<fstream> using namespace std;int main(){ // 定义输入文件流类对象infileifstream ...

耀州区15554366041: C++中如何定位到文本文件的最后一行,并读取最后一行的数据 -
源克胃好: 用seekg()函数去一行一行的读取文件中的内容,至到读到文件最后一行就可以读取最后一行的数据了!下面给你一个例子:for(m=0;m<10;m++) { int i=0;if(file) {file.seekg(m);<br>while(!file.eof()&&i<sizeof buffer)<br> file.get(buffer[i++]); }std::string b; b.append(buffer);} }

耀州区15554366041: C语言如何在txt中读取指定字符串的下一行数据? -
源克胃好: 用fgets读入一行,用sscanf 读出第一列数据 下面假定第一列数据作为字符串,用 sscanf(buf,"%s", ...格式读.类似,整型用 %d 浮点用 %f %lf ....#include <stdio.h>#include <stdlib.h> main(){ char buf[100]; char col[100][30]; int n=0; FILE *fp...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网