c语言 逐行读取文本文件的数时,怎么判断每行已经结束,然后读下一行

flyaway 2012-03-13 07:37:31
设计一个程序,从in.txt读入数据,对每一行的数字都单独按从大到小的顺序排序,将结果输出到out.txt。每一行的数字第一个字符是数字标志,每个数字之间用空格隔开。如:
读入:5 10 -20 2000 36 -100
输出:2000 36 10 -20 -100(注意5只是个开始标志)。
代码我写了一些,中文注释的地方表示有错误,不知道怎么搞了,求牛人帮忙指点,谢谢!
(要用c语言写)
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

void insertsort(int a[],int n)//插入排序算法
{
int i=0,j=0;
int x;
for(i=1;i<=n-1;i++)
{

x=a[i];
for(j=i-1;j>=0;j--)
if(x<a[j])
a[j+1]=a[j];
else break;
a[j+1]=x;
}
}
void main()
{
FILE *fp,*fo;
fp=fopen("d:\\file\\in.txt","r");
fo=fopen("d:\\file\\out.txt","w");
int a[1000];
int i=0;
int j=0;
memset(a,0,sizeof(a));
while(!feof(fp))
{
fgetc(fp);
i=0;
while(1)
{
fscanf(fp,"%d",&a[i]);
if(a[i]=='\n')break;//这个判断好像没用,就这里有问题吧,
else i++;
}
insertsort(a,i);
j=0;
while(j<=i)
{
fprintf(fo,"%d",a[j++]);
// printf("啊啊啊啊啊啊啊啊啊啊啊啊啊啊\n");
}
fprintf(fo,"\0");
// printf("啊啊啊啊啊啊啊啊啊啊啊啊啊啊\n");
}
fclose(fp);
fclose(fo);
}
...全文
2792 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyaway 2012-03-14
  • 打赏
  • 举报
回复
昨晚急了点,有点小错,回去改了下,彻底搞定!
题目:
设计一个程序,从in.txt读入数据,对每一行的数字都单独按从大到小的顺序排序,将结果输出到out.txt。每一行的数字第一个字符是数字标志,每个数字之间用空格隔开。如:
读入:5 10 -20 2000 36 -100
输出:2000 36 10 -20 -100(注意5只是个开始标志)。
源程序:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

void insertsort(int a[],int n)//插入排序算法
{
int i=0,j=0;
int x;
for(i=1;i<=n-1;i++)
{

x=a[i];
for(j=i-1;j>=0;j--)
if(x<a[j])
a[j+1]=a[j];
else break;
a[j+1]=x;
}
}
void main()
{
FILE *fp,*fo;
fp=fopen("d:\\file\\in.txt","r");
fo=fopen("d:\\file\\out.txt","w");
int a[1000];
char c;
int i=0;
int j=0;
memset(a,0,sizeof(a));
while(c=fgetc(fp)!=EOF)
{
ungetc(c,fp);
fgetc(fp);
i=0;
while(1)
{
c=fgetc(fp);
if(c=='\n')break;
else
{
ungetc(c,fp);
fscanf(fp,"%d",&a[i]);
i++;
}
}
insertsort(a,i);
j=0;
while(j<i-1)
{
printf("%d ",a[j]);
fprintf(fo,"%d ",a[j]);
j++;
}
printf("%d",a[j]);
fprintf(fo,"%d",a[j]);
printf("\n");
fprintf(fo,"\n");
}
fclose(fp);
fclose(fo);
}

文件in.txt的内容:
1 2 3 4 5
62 7 8 9
1 23 44 55 0
245 22 34 654 7678 88 56
73 2 33 93 409 503 332 354 89
1 70 65 130 89 354
2 64 56 116 96 332

排序完输出文件out.txt的内容:
2 3 4 5
2 7 8 9
0 23 44 55
22 34 45 56 88 654 7678
2 3 33 89 93 332 354 409 503
65 70 89 130 354
56 64 96 116 332

感谢各位大虾的帮忙!
flyaway 2012-03-13
  • 打赏
  • 举报
回复
最后附上我最后完整代码:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

void insertsort(int a[],int n)//插入排序算法
{
int i=0,j=0;
int x;
for(i=1;i<=n-1;i++)
{

x=a[i];
for(j=i-1;j>=0;j--)
if(x<a[j])
a[j+1]=a[j];
else break;
a[j+1]=x;
}
}
void main()
{
FILE *fp,*fo;
fp=fopen("d:\\file\\in.txt","r");
fo=fopen("d:\\file\\out.txt","w");
int a[1000];
char c;
int i=0;
int j=0;
memset(a,0,sizeof(a));
while(c=fgetc(fp)!=EOF)
{
ungetc(c,fp);
fgetc(fp);
i=0;
while(1)
{
c=fgetc(fp);
if(c=='\n')break;
else
{
ungetc(c,fp);
fscanf(fp,"%d",&a[i]);
i++;
}
}
insertsort(a,i-1);
j=0;
while(j<=i-1)
{
fprintf(fo,"%d ",a[j++]);

}
fprintf(fo,"\n");
}
fclose(fp);
fclose(fo);
}
读入文件:
1 2 3 4 5
62 7 8 9
1 23 44 55 0
245 22 34 654 7678 88 56
按题目要求排好序输出到文件内容:
2 3 4 5
2 7 8 9
23 44 55 0
22 34 45 88 654 7678 56
谢谢各位,给力
buzzerrookie 2012-03-13
  • 打赏
  • 举报
回复
给你演示了一下读一行的,扩展一下就行了。
读到'\n'时排个序输出到文件里,num是数组。

i = 0;
ch = fgetc(in);
while(ch != EOF){
if(ch >= '0' && ch <= '9'){
ungetc(ch, in);
fscanf(in, "%d", &num[i++]);
} else if(ch == '\n'){
i = 0;//为num重新读做准备
//给num数组排序,输出到文件
}
ch = fgetc(in);
}

没太看懂你给的测试数据,==。
flyaway 2012-03-13
  • 打赏
  • 举报
回复
11楼的程序有帮助,我改了一点,测试读入的数据如下:
while(c=fgetc(fp)!=EOF)
{
ungetc(c,fp);
fgetc(fp);
i=0;
while(1)//读入一行
{
c=fgetc(fp);
if(c=='\n')break;
else
{
ungetc(c,fp);
fscanf(fp,"%d",&a[i]);
printf("%d ",a[i]);
i++;
}
}
printf("\n");

}
我文件里面存的数:
1 2 3 4 5
62 7 8 9
1 23 44 55 0
245 22 34 654 7678 88 56
输出结果:
2 3 4 5
2 7 8 9
23 44 55 0
45 22 34 654 7678 88 56
Press any key to continue
刚好把每一行的第一个数字去掉了谢谢11楼12楼,
flyaway 2012-03-13
  • 打赏
  • 举报
回复
11楼,你这只是读了一行啊!
我的代码:
while(!feof(fp))
{
fgetc(fp);
i=0;
while(1)//读入一行
{
c=fgetc(fp);
if(c=='\n')break;
else
{
ungetc(c,fp);
fscanf(fp,"%d",&a[i]);
printf("%d ",a[i]);
i++;
}
}
printf("\n");

}


输出结果见上面,后面好多没用的乱数据,前面输出的都是对的!
shyrgst 2012-03-13
  • 打赏
  • 举报
回复
如果LZ要这样,
while(1)
{
char k;
k=fgetc(fp);
if(k=='\0')break;
else
ungetc(k,fp);
fscanf(fp,"%d",&a[i]);
//这个判断好像没用,就这里有问题吧,
else i++;
}
看行不,以前还没有用过ungetc,学习了
buzzerrookie 2012-03-13
  • 打赏
  • 举报
回复
我是这么读入的:

int ch;
ch = fgetc(in);
while(ch != EOF){
if(ch >= '0' && ch <= '9'){
ungetc(ch, in);
fscanf(in, "%d", &num);//都读到num里,换成数组什么的也可以
}
ch = fgetc(in);
}
flyaway 2012-03-13
  • 打赏
  • 举报
回复
5楼看看,我只是测试读出情况,还没排序,下面的输出结果,后面出现一大堆0就不对了,感觉while(!feof(fp)){}没起到控制读入结束作用丫,求解释
0 2 15 13
2 3 4 56 8
3 44 67 889 1 0
2 5
2 5 67 889 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
flyaway 2012-03-13
  • 打赏
  • 举报
回复
5楼,再请教一下,按照你的方法,出现了新问题,就是输出完正确的数据之后,后面会有很多乱的数字,2楼用\0解决了,再给点建议,7楼我懂你的意思了,就是读入一行字符串把他转换为数字再排序是吧?我现在想直接读入排序,差一点点了!谢谢
橡皮擦 2012-03-13
  • 打赏
  • 举报
回复
if(a[i]=='\n')break;//这个判断好像没用,就这里有问题吧,

把这句改成if(getchar() == '\n') break;就行了
shyrgst 2012-03-13
  • 打赏
  • 举报
回复
‘\0’按照ASCII就是0,所以这样可能会碰到0,判断就成立了,你最好按字符的形式读入,在意字符的形式判断就可以了。
flyaway 2012-03-13
  • 打赏
  • 举报
回复
5楼方法好啊,我先试试,谢谢
buzzerrookie 2012-03-13
  • 打赏
  • 举报
回复
每次读一个字符试探一下,如果是'0'到'9'之间再ungetc回去,用fscanf读这个数字;如果是'\n'说明下一行;如果是EOF则到了文件末尾。fgets是读字符串的。
flyaway 2012-03-13
  • 打赏
  • 举报
回复
2楼方法有点效果,就是后面不会输出乱七八糟的数字了,但是遇到正常的数字0,他也判断为换行了呀,这是不对的,怎么办?
flyaway 2012-03-13
  • 打赏
  • 举报
回复
fgets返回的是数字吗?我要数字,我试试
shyrgst 2012-03-13
  • 打赏
  • 举报
回复
if(a[i]=='\n')break;
改为==‘\0’试试
jixingzhong 2012-03-13
  • 打赏
  • 举报
回复
fgets直接读取一行,然后根据字符串的长度处理就是了。
简介:CETool是一个WinCE的辅助程序,使用C语言和Windows API编写,作了一些特殊处理以同时支持WinCE5和WinCE6,主要实现shell中的功能,提供的各种操作涉及到文件系统、窗口管理、进程管理和流程控制几个方面,通过解析配置文件内容来执行相应的操作,属于一种脚本解析程序。程序有以下特点:1. 程序一般是在原路径执行,比如一开始就放置在\Storage Card\目录下,即打开后就以\Storage Card\为工作目录开始处理各项操作。考虑到在程序运程过程中可能要对程序所在分区(或磁盘)进行格式化(或者是移除SD卡)等操作,故添加了一项“自我复制到内存中运行”的功能,即启动后先检测工作目录是不是在内存虚拟出来根目录"\"下,如果不是则先对自身进行复制再重新加载复制后的可执行文件,以便后续的SD移除、或者格式化等操作。对于配置文件,因为是一开始就读进内存中的,所以无需进行复制。此功能一般都不需要使用,即直接在原来的路径运行即可,如需开始此功能,只需将配置文件的文件名从CETool.ini改为_CETool.ini即可。 2. 程序在一次性加载完配置文件后,接着逐行去解析文件内容,遇到注释行或者是格式不正确的行则跳过该行,配置文件有以下特点: (1)配置文件无大小限制,仅取决于物理内存大小,支持Unicode与ANSI编码的文件格式; (2)配置文件中每行的长度无限制,但某些操作的参数对长度有一定限制,如创建目录时,作为目录名的参数的长度有限制(这是文件系统和API的问题)。 (3)各个操作放置的位置、出现的次数无限制。 (4)每一行中的子操作数量无限制。 (5)具有合理的严格性和纠错处理,每一行中在'='后边非关键字处可随意添加空格、制表符、逗号,不影响正常解析,关键内容可以加上引号(单引号和双引号的区别,将在后述提到),如包含空格的路径、参数等。详细介绍参数特殊说明。 3. 支持相对路径的表示方式。参考特殊说明。 4. 支持从文件读入并作为参数的方式(即配置文件中嵌入其它文件,嵌套层数无限制,一般为临时创建的文件,一些不确定参数可以先保存到临时文件,再用此程序读取)。参考特殊说明。5. 支持VB代码嵌入,方便变量使用、判断、循环(这些还有些问题需要解决,将在CETool v2.0中实现)。 此程序涉及内容: 此程序涉及到一些Windows和C语言的基础知识,包括文件系统、注册表、进程、线程、窗口、事件、消息、进程间与线程间通信、脚本、动态库、递归、回调、多维指针、函数指针、数据结构、加密算法等。

69,369

社区成员

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

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