【转载】fscanf和fprintf函数从文件中格式化读取double型数据 分类: ...


【转载】fscanf和fprintf函数从文件中格式化读取double型数据


C语言中fscanf函数读取double型浮点数的问题点击打开转载链接1)

在C语言里面, 将一个浮点数输出到文件中, 可以使用符号%f, 如

double a = 0.0;
fprintf(fp, "a = %f", a); 

而如果要从文件中读取一个double类型的浮点数, 就不能用%f, 而要用%lf才可以. 如 

double a;
float b;
fscanf(fp, "%f", &a);  // 这里得到的a的数值不是所期望的值
fscanf(fp, "%lf", &a); // 正确
fscanf(fp, "%f", &b);  // 正确 
追究一下原因, 是因为格式符"%f"指示的是一个float类型(4个字节), 而我们给的指针位置(&a)是一个双精度(double)类型, 占8个字节, 这样在上面的第一个fscanf语句中, 实际上把a当初float类型, 也就是只填了8个字节的前4个字节, 而后面的4个字节并没变, 这样变量a的数据就不是一个正确的值.而格式符"%lf"利用修饰符l来表示这是一个长类型的浮点数(即双精度), 所有会得到正确的值.
而我们通常在程序中习惯定义浮点数为double类型, 所以在scanf函数中要谨慎使用"%f", 而应该使用"%lf".

注意:

fprintf处理double型数据时也要用“%lf”,用“%f”可能输出的值不正确或者无法输出想要的值。


转载于:https://www.cnblogs.com/gengzj/p/4675791.html

### 文件读取函数 #### `fread` `fread` 用于从文件读取二进制数据块。它适用于处理非文本数据,如结构体或数组。函数如下: ```c size_t fread(void* buf, size_t size, size_t count, FILE* fp); ``` 其中,`buf` 是内存缓冲区的指针,用于存放读取到的数据;`size` 是每个数据块的字节数;`count` 是要读取数据块个数;`fp` 是文件指针。`fread` 返回实际读取的完整项目数,如果发生错误或在达到 `count` 前遇到文件结尾,则返回值可能小于 `count` [^3]。 例如,读取一个包含整数浮点数的结构体: ```c #include <stdio.h> typedef struct { int n; double d; } S; int main() { S s = {0}; FILE* pf = fopen("data.txt", "r"); if (pf == NULL) { perror("fopen"); return -1; } // 读取结构体数据 fscanf(pf, "%d %lf", &(s.n), &(s.d)); printf("%d %lf\n", s.n, s.d); fclose(pf); return 0; } ``` #### `fgets` `fgets` 用于从文件中逐行读取文本数据。它能够防止缓冲区溢出,适用于处理格式化文本文件。函数如下: ```c char* fgets(char* str, int n, FILE* stream); ``` 其中,`str` 是用于存储读取数据的字符数组;`n` 是最大读取字符数;`stream` 是文件指针。`fgets` 会读取一行内容,并在末尾自动添加空字符(`\0`)[ ^1 ]。 例如,逐行读取文件内容: ```c #include <stdio.h> int main() { FILE* file = fopen("example.txt", "r"); if (file == NULL) { perror("无法打开文件"); return 1; } char line[256]; while (fgets(line, sizeof(line), file)) { printf("%s", line); } fclose(file); return 0; } ``` #### `fgetc` `fgetc` 用于逐个字符地读取文件内容。它适用于需要逐字符处理的场景。函数如下: ```c int fgetc(FILE* stream); ``` `fgetc` 返回读取的字符(作为 `int` 类),如果遇到文件结束或发生错误,则返回 `EOF` [ ^2 ]。 例如,逐字符读取文件内容: ```c #include <stdio.h> int main() { FILE* fp = fopen("example.txt", "r"); if (fp == NULL) { perror("fopen"); return 1; } int ch; while ((ch = fgetc(fp)) != EOF) { putchar(ch); } fclose(fp); return 0; } ``` #### `fscanf` `fscanf` 用于从文件读取格式化输入,类似于 `scanf`,但数据来源是文件。函数如下: ```c int fscanf(FILE* stream, const char* format, ...); ``` `fscanf` 会按照 `format` 指定的格式读取数据,并将其存储到指定的变量中。它返回成功读取并赋值的输入项数目 [ ^3 ]。 例如,从文件读取整数浮点数: ```c #include <stdio.h> int main() { FILE* pf = fopen("data.txt", "r"); if (pf == NULL) { perror("fopen"); return -1; } int n; double d; fscanf(pf, "%d %lf", &n, &d); printf("读取的整数:%d,读取的浮点数:%lf\n", n, d); fclose(pf); return 0; } ``` --- ### 文件写入函数 #### `fwrite` `fwrite` 用于将二进制数据写入文件。它适用于写入结构体、数组等非文本数据函数如下: ```c size_t fwrite(const void* ptr, size_t size, size_t count, FILE* stream); ``` 其中,`ptr` 是指向要写入数据的指针;`size` 是每个数据项的字节数;`count` 是要写入的数据项个数;`stream` 是文件指针。`fwrite` 返回实际写入的数据项数 [ ^4 ]。 例如,将结构体数据写入文件: ```c #include <stdio.h> typedef struct { int id; char name[20]; } Person; int main() { Person p = {1, "Alice"}; FILE* file = fopen("people.dat", "wb"); if (file == NULL) { perror("无法打开文件"); return 1; } fwrite(&p, sizeof(Person), 1, file); fclose(file); return 0; } ``` #### `fputs` `fputs` 用于将字符串写入文件,不包含结尾的空字符。函数如下: ```c int fputs(const char* str, FILE* stream); ``` 其中,`str` 是要写入的字符串;`stream` 是文件指针。函数返回非负值表示成功,否则返回 `EOF` [ ^1 ]。 例如,将字符串写入文件: ```c #include <stdio.h> int main() { FILE* file = fopen("output.txt", "w"); if (file == NULL) { perror("无法打开文件"); return 1; } const char* text = "Hello, World!"; fputs(text, file); fclose(file); return 0; } ``` #### `fputc` `fputc` 用于将单个字符写入文件。函数如下: ```c int fputc(int ch, FILE* stream); ``` 其中,`ch` 是要写入的字符(作为 `int` 类);`stream` 是文件指针。函数返回写入的字符,如果发生错误则返回 `EOF` [ ^2 ]。 例如,逐字符写入文件: ```c #include <stdio.h> int main() { FILE* file = fopen("output.txt", "w"); if (file == NULL) { perror("无法打开文件"); return 1; } const char* text = "Hello, World!"; for (int i = 0; text[i] != '\0'; i++) { fputc(text[i], file); } fclose(file); return 0; } ``` #### `fprintf` `fprintf` 用于将格式化数据写入文件,类似于 `printf`,但输出目标是文件。函数如下: ```c int fprintf(FILE* stream, const char* format, ...); ``` `fprintf` 返回成功写入的字符数,如果发生错误则返回负值 [ ^3 ]。 例如,将整数浮点数格式化写入文件: ```c #include <stdio.h> int main() { FILE* file = fopen("output.txt", "w"); if (file == NULL) { perror("无法打开文件"); return 1; } int age = 25; double height = 1.75; fprintf(file, "年龄:%d,身高:%lf\n", age, height); fclose(file); return 0; } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值