C语言中的fscanf读取文本文件一行而不能读取行中数据的解决方法

本文探讨了C语言中使用fscanf函数读取文本文件时遇到的问题,即无法正确读取行内姓名后的数字。通过分析示例代码,展示了在文件格式为'姓名,数字'时,fscanf无法将数字读入变量的情况。提出了两种解决方案:一是调整文件格式为'数字,姓名',并相应修改fscanf的格式字符串;二是自定义get_num函数,单独提取逗号后的数字。" 125695533,7126118,网络回放工具:tcpreplay、tcpprep和tcprewrite详解,"['服务器', '运维', '网络测试']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在学习c语言的时候,我们可能会对fscanf的读取存在疑惑,这也是c语言的一个bug。

在"E:\\temp\\a.txt"的a.txt的内容如下:

张三,600

李四,500

王五,1200

程序要解决的问题是:读取姓名后面的数字,并求和;

程序的代码如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #pragma warning (disable:4996)
  4. int main()
  5. {
  6.     FILE *p = fopen("E:\\temp\\a.txt", "r");
  7.     int sum = 0;
  8.     while (!feof(p))
  9.     {
  10.       &n
<think>好的,用户想了解如何使用C语言fscanf函数从文件中逐读取整型数据到数组。我需要先回忆一下相关的函数和步骤。首先,fscanf函数是用来从文件中格式化读取数据的,类似于scanf,但是针对文件流。 用户提到要逐读取,所以可能需要处理每一行数据。但fscanf本身是按格式读取,不会自动区分,除非在格式字符串中指定。例如,如果每只有一个整数,可以循环使用fscanf直到文件结束。但如果每有多个整数,可能需要结合其他方法,比如先读取一行,再用sscanf处理。 接下来,示例代码的结构应该是:打开文件,检查是否成功,然后循环读取数据,存入数组,最后关闭文件。要注意数组的大小,防止溢出,或者动态分配内存。 用户提供的引用中有几个相关的例子,比如引用[1]中的fscanf读取结构体数据,引用[2]提到用fscanf读取数据到数组。需要参考这些例子中的做法,比如使用循环和文件指针。 可能需要注意的问题包括:文件打开模式是否正确,错误处理,以及如何判断文件结束。例如,使用fscanf的返回值是否等于预期的参数数量,或者检查是否到达EOF。 另外,如果每数据数量不确定,可能需要逐读取,比如用fgets读取一行,再解析其中的整数。但用户的问题明确提到用fscanf,所以可能需要使用格式字符串中的符处理,或者调整格式。 例如,如果每有一个整数,格式字符串可以是"%d\n",但通常换符会被fscanf自动跳过。所以可能直接循环调用fscanf(fp, "%d", &arr[i]),直到返回EOF。 如果每有多个整数,比如每有n个,可能需要更复杂的格式,或者先读取再分割。但用户的问题可能更倾向于每一个整数的情况。 需要给出一个具体的例子,展示如何打开文件,读取每个整数到数组,并处理可能的错误。同时要提到数组大小管理和动态分配,以防数据量未知。 现在结合引用中的例子,比如引用[2]中的代码,用fopen、fscanf、fclose。还需要注意数组的索引和循环条件。 最后,生成相关问题,可能涉及如何处理不同格式的文件,动态数组,或者错误处理等。</think>### 如何用C语言通过`fscanf`逐读取整型数据到数组 以下是具体实现步骤和示例代码: #### 1. **打开文件** 使用`fopen`函数以只读模式打开文件,并检查是否成功: ```c FILE *fp = fopen("data.txt", "r"); if (fp == NULL) { perror("文件打开失败"); return 1; } ``` #### 2. **逐读取并存储到数组** 假设文件中每包含**一个整型数据**,使用`fscanf`循环读取: ```c int arr[100]; // 假设最多存储100个整数 int i = 0; // 循环读取,直到文件结束或数组满 while (i < 100 && fscanf(fp, "%d", &arr[i]) != EOF) { i++; } ``` 若文件数未知,建议使用**动态内存分配**(例如`realloc`)[^2]。 #### 3. **完整示例代码** ```c #include <stdio.h> #include <stdlib.h> int main() { FILE *fp = fopen("data.txt", "r"); if (fp == NULL) { perror("fopen失败"); return 1; } int *arr = NULL; int num, capacity = 10, size = 0; arr = (int*)malloc(capacity * sizeof(int)); // 逐读取整数 while (fscanf(fp, "%d", &num) != EOF) { if (size >= capacity) { // 动态扩容 capacity *= 2; arr = (int*)realloc(arr, capacity * sizeof(int)); } arr[size++] = num; } // 输出验证 for (int i = 0; i < size; i++) { printf("%d\n", arr[i]); } free(arr); fclose(fp); return 0; } ``` #### 4. **关键说明** - **动态数组**:通过`malloc`和`realloc`实现动态扩容,避免数据溢出[^2]。 - **格式匹配**:`fscanf(fp, "%d", &num)`会跳过空白字符(包括换符),因此可直接逐读取。 - **错误处理**:若文件格式包含非整型数据,`fscanf`会返回匹配失败(返回值 `< 1`),需额外处理[^3]。 #### 5. **文件格式示例(data.txt)** ``` 10 20 -5 30 ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值