繁体   English   中英

如何从文件中获取整数-字符串-浮点数?

[英]How can get int - string - float from file?

我有一个像这样的文件:

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;
}

那怎么办?

这是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个字符,因为最后一个用于空终止
  • 因为fscanf需要一个指针,所以将intfloat参数使用与号传递给fscanf 另一方面,字符串不带“&”号,因为它等效于指针。

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

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

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

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

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

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

但是,在涉及名称的地方,ASCII不太适合。 这意味着您需要类似UTF-8的内容。 在这种情况下,您至少需要检查字节是否有效(可变长度)UTF-8序列; 除了检查无效字符外(例如“删除”或“垂直标签”)。

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

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

例如,也许每行的第一个数字必须是4位数字的代码(例如“ 0123”); 如果只有3位数字(例如“ 123”),则您想生成一个错误(例如“ 错误:文件'foo.txt'的第5行上的CourseID太短 ”),以便用户轻松知道确切的内容问题是用户易于修复。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM