![](/img/trans.png)
[英]How to check if a string from a text file is an int, or float, or none(string)?
[英]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
需要一个指针,所以将int
和float
参数使用与号传递给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.