如何从文件中获取int - string - float?

时间:2014-12-15 10:57:50

标签: c file char int

我有一个像这样的文件:

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)? 我怎样才能得到每一行的名称(例如荷马)?

我在下面写了这段代码:

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

怎么做?

3 个答案:

答案 0 :(得分:4)

这是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返回从文件中读取的项目数。继续致电fscanf,同时返回3
  • %24s表示&#34;长度最多为24个字符的字符串&#34;。 name有25个字符,因为最后一个字符用于空终止
  • intfloat参数通过&符传递给fscanf,因为fscanf需要指针。另一方面,字符串不带符号,因为它等同于指针。

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:-1)

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

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

但是,如果涉及名称,则ASCII极不可能。这意味着你需要像UTF-8这样的东西。在这种情况下,您至少需要检查字节是否有效(可变长度)UTF-8序列;除了检查无效字符(例如“删除”或“垂直标签”)。

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

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

例如,每行上的第一个数字可能是4位数代码(如“0123”);如果只有3位数字(如“123”)那么你想生成一个错误(例如“错误:文件'foo.txt'的第5行的课程ID太短了”)这样很容易让用户确切地知道问题是什么,并且用户很容易解决它。

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