【问题标题】:Read integers AND characters from file line by line in C在C中逐行读取文件中的整数和字符
【发布时间】:2022-01-07 13:46:11
【问题描述】:

我有一个这种格式的txt文件:

11
10
BU
1U
0U
0U
...

我想从 C 文件中一个一个地读取每个数字/字符。 前两行包含 2 个整数,其余行首先包含一个字母/整数,然后是一个字母。 不幸的是,我不知道如何实现这一点,因为你不知道你读的是整数还是字符。

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 类似if (scanf("%d", &num) != 1) //not a number, read the string?
  • 也许是char buf[4]; fgets(buf, sizeof buf, stdin);?然后,处理字符串。
  • @chux-ReinstateMonica 谢谢。为什么缓冲区的大小是 4 而不是 2?
  • fgets() 读取 line 并形成 string。每有多少个字符?第一可能是'1''1''\n'。要将其保存为 string 需要多少个char? (注意:在 C 中,strings 末尾有一个 null 字符。)
  • 我知道前两行总是整数。我了解您愿意以不同的方式对待他们。 “更简单”的方法——除了从长远来看确实更容易——是使用fscanf%d。但是fscanf 与您将要在其余行上使用的fgets 混合得非常糟糕,并且还有许多其他问题。使用fgets 将每一行作为纯文本读取确实会更容易。然后要将前两行转换为整数,只需在您阅读的行上使用atoi。这应该很容易。

标签: c input scanf txt fgetc


【解决方案1】:

这是一个关于如何处理文件中的每个字符并在遇到字符时转换为整数的最小示例。我相信您可以尝试根据您的需要调整此代码。 代码另外跳转换行符和EOF。

要更好地了解其工作原理,请查看标准 ASCII

#include<stdio.h>


int main(){
  FILE * handle;
  handle = fopen("data.txt","r");
  char var;

  while(var!=EOF){
    var=fgetc(handle);
    if(var>47&&var<58){
      printf("Value: %d",var);
      printf(" Integer: %d \n",var-48);
    }
    else if(var!=10 && var!=-1){
      printf("Value: %d",var);
      printf(" Char or other: %c\n",var);
  
    }
  }
 
}

输出:

Value: 49 Integer: 1 

Value: 49 Integer: 1

Value: 49 Integer: 1

Value: 48 Integer: 0

Value: 66 Char or other: B

Value: 85 Char or other: U

Value: 49 Integer: 1

Value: 85 Char or other: U

Value: 48 Integer: 0

Value: 85 Char or other: U

Value: 48 Integer: 0

Value: 85 Char or other: U

【讨论】:

  • 谢谢!我知道前 2 行肯定会包含 2 个整数,那么没有更适合前 2 行的内置函数吗?
  • 不要说“为了更好地理解这是如何工作的,请查看标准ASCII”,让每个人都追逐那个链接并盯着图表,如果你只写@就更容易了987654325@和printf(" Integer: %d \n", var-'0');
  • 我不太明白这个问题,你能详细说明你想达到什么目标吗?
  • @Erik .txt 文件中的前 2 行肯定是 2 位数字,从第 3 行开始的其他行可能包含字符,但前 2 行仅包含整数。
  • 那么没有更适合前 2 行的内置函数吗?只从文件中取一个整数,因为我知道 100% 它是一个整数。
猜你喜欢
  • 1970-01-01
  • 2022-01-25
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 2010-11-19
相关资源
最近更新 更多