【问题标题】:How can get int - string - float from file?如何从文件中获取 int - string - float?
【发布时间】:2015-02-13 10:58:57
【问题描述】:

我有一个像这样的文件:

1234 Homer 18.5
1223 Bart 25.5
9341 Lisa 30.0
3420 Marge 28.4
8730 Abram 26.7
1876 Barns 27.8
1342 Smiters 23.0
7654 Milhouse 29.7

如何获取每行的第一部分(例如 1234 )? 以及如何获取每行的名称(例如 Homer )?

我在下面写了这段代码:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main()
{
   char ch[25];
   int i, num;
   FILE *fp;
    fp = fopen("studenti.txt","r"); // read mode

   if( fp == NULL )
   {
      perror("Error while opening the file.\n");
      exit(EXIT_FAILURE);
   } 

   printf("The contents of numeri.txt file are :\n");

   for(i = 0; i < 25; i++){
   while( ( ch[i] = fgetc(fp) ) != EOF ){    


   if(!(ch[i] >= 'A' && ch[i] <= 'Z') && !( ch[i] >= 'a' && ch[i] <='z')){printf("%c",ch[i]);}


}}




   fclose(fp);
   return 0;
}

怎么可能?

【问题讨论】:

标签: c file char int


【解决方案1】:

如果您确定文本格式,最简单的可能是使用fscanf

int num;
char name[1024];
float grade;

fscanf(fp, "%d %s %f", &num, name, &grade);

请注意,如果名称超过 1024 个字符,则会出现缓冲区溢出。如果格式不确定,则需要查看 fscanf 的返回码(参见手册页)。

【讨论】:

  • 你确定,你的意思是sscanf而不是fscanf
【解决方案2】:

这就是fscanf 函数的用途:

int n;
char name[25];
float x;
FILE* fp = ...
while (fscanf(fp, "%d%24s%f", &n, name, &x) == 3) {
    // Do something with the data you just read:
    printf("int=%d name='%s' float=%f\n", n, name, x);
}

以上几点需要注意:

  • fscanf 返回它从文件中读取的项目数。在返回 3 时继续调用 fscanf
  • %24s 表示“长度最多为 24 个字符的字符串”。 name 有 25 个字符,因为最后一个用于空终止
  • intfloat 参数使用 & 号传递给 fscanf,因为 fscanf 需要一个指针。另一方面,字符串不带与号,因为它相当于一个指针。

【讨论】:

  • 谢谢大家。你救了我的命!
【解决方案3】:

您从文件中读取的唯一内容是字节。

第一步是检查字节是否为有效字符,必要时将字节转换为字符。这不一定简单。如果字节应该是 ASCII,那么您可能只需要检查字节是否是有效的 ASCII(例如,不小于或等于零且不大于 0x80;并且可能不是控制字符,如“删除”或“垂直制表符” )。

但是,在涉及名称的情况下,ASCII 不太可能就足够了。这意味着您需要 UTF-8 之类的东西。在这种情况下,您至少需要检查字节是否是有效的(可变长度)UTF-8 序列;除了检查无效字符(如“删除”或“垂直制表符”)。

更复杂的是,如果您根本不知道字节是什么。有一些方法可以自动检测字符编码(但它的启发式方法并非 100% 可靠)。

第二步是解析。解析通常有两个同样重要的目标。第一个目标是将字符转换为更容易处理的形式 - 例如就像一个具有 3 个字段(整数、字符串和浮点数)的结构,代表每行字符。解析的第二个目标是以易于理解的方式向用户报告任何错误。

例如,可能每行的第一个数字必须是 4 位代码(如“0123”);如果只有 3 位数字(例如“123”),那么您想生成一个错误(例如“ERROR: CourseID too short on line 5 of file 'foo.txt'”),这样很容易让用户准确了解问题所在,方便用户修复。

注意:我认为我从未见过使用接近(我认为)可接受的fscanf() 的代码。几乎没有有用的/描述性的错误消息。

【讨论】:

    猜你喜欢
    • 2016-08-11
    • 2023-03-04
    • 2018-05-17
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2011-03-05
    • 2019-12-11
    相关资源
    最近更新 更多