C语言基础---文件格式化读写和大数据排序
2018-07-18 本文已影响5人
ZebraWei
版权声明:本文为小斑马伟原创文章,转载请注明出处!
一、格式化读文件
int fscanf(FILE* stream,const char*format,...);
功能:从stream指定的文件读取字符串,病根据参数format字符串转换并格式化数据。
参数: stream 已经打开的文件 format:字符串格式,用法和scanf()一样
返回值:成功:参数数目,成功转换的值的个数 失败:-1
读取字符串:
FILE* fp = fopen("D://a.txt", "r");
if (!fp) {
return -1;
}
char* p = (char*)malloc(sizeof(char)* 100);
//遇到换行就停止
fscanf(fp, "%s", p);
printf("%s", p);
printf("\n");
fscanf(fp, "%s", p);
printf("%s", p);
printf("\n");
fscanf(fp, "%s", p);
printf("%s", p);
printf("\n");
fscanf(fp, "%s", p);
printf("%s", p);
printf("\n");
free(p);
fclose(fp);
return 0;
格式化读取运算符:
FILE* fp = fopen("D:/b.txt", "r");
if (!fp)
return -1;
int a, b, c;
fscanf(fp, "%d+%d=%d", &a, &b, &c);
printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", c);
fclose(fp);
return 0;
二、格式化写文件
int fprintf(FILE* stream,const char* format,...);
功能:根据参数format字符串来转换并格式化数据,然后将结果输出到stream指定的文件中,指定出现字符串结束符'\0'为止
参数: stream 已经打开的文件 format 字符串格式 用法和printf()一样
返回值:成功:实际写入文件的字符个数 失败: -1
int main(void) {
FILE* fp = fopen("d:/b.txt", "w");
if (!fp)
return -1;
char ch[] = "hello world";
//格式化写入 会覆盖以前文本内容
fprintf(fp, "%s", ch);
fclose(fp);
return 0;
}
int main(void) {
FILE* fp = fopen("d:/b.txt", "w");
if (!fp)
return -1;
int a = 10;
//格式化写入 会覆盖以前文本内容
//fprintf(fp, "%05d", a);
fprintf(fp, "%05x", a);
fclose(fp);
return 0;
}
四则运算格式化的读写操作:
enum opt {
add,sub,mlt,dive
}op;
int main() {
srand((size_t)time(NULL));
FILE* fp = fopen("D://四则运算.txt", "w");
if (!fp) {
return -1;
}
int a, b;
char c;//+ - * /
//char* p = (char*)malloc(sizeof(char)* 20);
for (int i = 0; i < 100; i++) {
a = rand() % 10 + 1;
b = rand() % 10 + 1;
switch (rand()%4)
{
case add: c = '+';
break;
case sub: c = '-';
break;
case mlt: c = '*';
break;
case dive: c = '/';
break;
default:
break;
}
//memset(p, 0, 20);
//printf(p, "%d%c%d=\n", a, c, b);
//fputs(p, fp);
//格式化写入
fprintf(fp, "%d%c%d=\n", a, c, b);
}
fclose(fp);
system("pause");
return 1;
}
int main(void) {
FILE* fp1 = fopen("D:/四则运算.txt", "r");
FILE* fp2 = fopen("D:/四则运算结果.txt", "w");
if (!fp1 || !fp2) {
printf("打开文件失败\n");
return -1;
}
int a,b,sum;
char c;
//char* p = (char*)malloc(sizeof(char)*20);
for (int i = 0; i < 100; i++) {
//memset(p, 0, 20);
//fgets(p,20,fp1);
//格式化读出
fscanf(fp1, "%d%c%d=\n", &a, &c, &b);
//sscanf(p, "%d%c%d=\n", &a, &c, &b);
switch (c) {
case '+':sum = a + b; break;
case '-':sum = a - b; break;
case '*':sum = a * b; break;
case '/':sum = a / b; break;
}
// /memset(p, 0, 20);
//sprintf(p, "%d%c%d = %d\n", a, c, b, sum);
//fputs(p, fp2);
fprintf(fp2, "%d%c%d=\n", a, c, b);
}
//free(p);
fclose(fp1);
fclose(fp2);
return 0;
}
三、冒泡排序法大文件的读写
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#define SIZE 10000
int main(void) {
srand((size_t)time(NULL));
FILE* fp = fopen("D://数据.txt", "w");
if (!fp)
return -1;
for (int i = 0; i < 1000; i++) {
fprintf(fp, "%d\n", rand() % 256);
}
fclose(fp);
return 0;
}
int main() {
FILE* fp1 = fopen("D:/数据.txt", "r");
FILE* fp2 = fopen("D:/数据冒泡版排序.txt", "w");
if (!fp1 || !fp2)
return -1;
//冒泡版
int* arr = (int*)malloc(sizeof(int)* 1000);
for (int i = 0; i < SIZE; i++) {
fscanf(fp1, "%d\n", &arr[i]);
}
BubbleSort(arr, SIZE);
for (int i = 0; i < SIZE; i++) {
fscanf(fp2, "%d\n", arr[i]);
}
free(arr);
fclose(fp1);
fclose(fp2);
return 0;
}
int count = 0;
void BubbleSort(int* src, int len) {
for (int i = 0; i < len - 1; i++) {
for (int j = 0; j < len - 1 - i; j++) {
count++;
if (src[j] > src[j + 1]) {
int temp = src[j];
src[j] = src[j + 1];
src[j + 1] = temp;
}
}
}
printf("%d\n", count);
}
四、快速插入排序法大文件的读写
FILE* fp1 = fopen("D:/数据.txt", "r");
FILE* fp2 = fopen("D:/数据插入版排序.txt", "w");
if (!fp1 || !fp2)
return -1;
int* arr = (int*)malloc(sizeof(int)* 256);
memset(arr, 0, sizeof(int)* 256);
for (int i = 0; i < 1000; i++) {
int value;
fscanf(fp1, "%d\n", &value);
arr[value]++;//将数据的个数放到对应的小标里面
}
for (int i = 0; i < 256; i++) {
for (int j = 0; j < arr[i]; j++) {
fprintf(fp2, "%d\n", i);
}
}
free(arr);
fclose(fp1);
fclose(fp2);
return 0;