关于C语言的文件操作

gattso 2006-01-06 08:56:48
从c:\first.txt文件中中读入数据,输入文件格式如下:
? 第一行一个数n,表示文件中有几组数对
? 从第二行到n+1行,每行两个数,中间以逗号分隔
对这些数据进行排序,排序方式为从小到大,先按第一个数的大小,若第一个数相同则按第二个数的大小排。结果输出到c:\first_answer.txt,输出文件的格式如下:
? 第一行一个数n,表示文件中有几组数对
? 从第二行到第n+1行,按排好序的数对输出
例如:
输入:first.txt:
4
2,3
4,6
2,6
6,8
输出:first_answer.txt:
4
2,3
2,6
4,6
6,8

初学C,文件的读取与我预期的不符..下面是我写的代码..望大虾指教下错误

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

#define MAX 20
void sort(char *string[], int num);

void main(){
//static int max = 10;
FILE *fp, *fp2, *fp3;
char stor[MAX][4];
char *data[4];
char c;
int ct = 0;

fp2 = fopen("F:/test_1.txt", "w+");
fp = fopen("F:/test.txt", "r+");
//fread(buf, sizeof(char), 3, fp);
c = fgetc(fp);
int i = (int)c;
fgetc(fp);
//int i = 4;
while(ct < i && fgets(stor[ct], 4, fp) != NULL && stor[ct][4] != '\0')
{
data[ct] = stor[ct];
ct++;
}
sort(data, ct);
fwrite(&c, sizeof(char), 1, fp2);
for(int a = 0; a < ct; a++){

fp3 = fopen("F:/test_1.txt", "a");
fwrite(data[a], sizeof(char), 4, fp3);
}
//sort(data, ct);
/*for(int a = 0; a < ct; a++){
puts(data[a]);
fwrite(data[a], sizeof(char), 4, fp2);
}*/
fclose(fp);
fclose(fp2);
}
void sort(char *string[], int num){
char *tmp;
int top, seek;
for(top = 0; top < num -1; top++)
for(seek = 1; seek < num; seek ++)
if(strcmp(string[top], string[seek]) > 0)
{
tmp = string[top];
string[top] = string[seek];
string[seek] = tmp;
}
}


...全文
295 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
benjaming1981 2006-01-08
  • 打赏
  • 举报
回复
1.读取一行数据:fprintf(fp, "%d\n", buffer);---自动完成了文本数值和二进制间的转换
2.根据buffer的值,申请空间,int *p = (int *)malloc(buffer*2);-申请存储数据的空间
RainWindy 2006-01-07
  • 打赏
  • 举报
回复
如果在纯DOS下执行fopen("F:/test.txt", "r+"); 会失败
RainWindy 2006-01-07
  • 打赏
  • 举报
回复
没有仔细看你的程序执行是否有问题。

读取一行数据:fgets
输出一行数据到文件fprintf(fp, "%s\n", buffer);

一、读取第一行,转换成数字atoi(),获取有多少行

二、循环读取各行,并读取每行信息,分隔两个数字使用strchr(buffer, ',')

三、对读取的数据排序

四、输出数据fprintf()...
trackant 2006-01-07
  • 打赏
  • 举报
回复
瞧了一下文件读取部分,似乎有点小问题:
1. 文件第一行已经指定了行数, 如果没有异常的话读文件时可以不用判断文件结束.
2. 程序中文件结束判断: while(ct < i && fgets(stor[ct], 4, fp) != NULL && stor[ct][4] != '\0')中的stor[ct][4]是不是有问题?未结束时stor[ct][3]等于'\n', 结束时stor[ct][3]等于'\0'吧, stor[ct][4]越界访问了.
3.读进来后可以把stor[ct][3]的'\n'替换为'\0'. 否则字符串没有结束的话会给后面sort函数中的strcmp带来麻烦.

PS:
赞一下fopen("F:/test.txt", "r+"); 居然连转义字符都省了:p
jixingzhong 2006-01-07
  • 打赏
  • 举报
回复
c = fgetc(fp);
int i = (int)c;
==>

c = fgetc(fp);
int i = c - '0';

强制转换的时候,注意 字符型的 数字 和 数据型的数字的差别,
直接那么转换是不行滴 ....

70,020

社区成员

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

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