我有一个像这样的文件:
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;
}
怎么做?
答案 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个字符,因为最后一个字符用于空终止int
和float
参数通过&符传递给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()
的代码。几乎没有任何有用/描述性的错误消息。