我有一个用逗号分隔单词和数字的txt文件。我想读入字符,直到下一个逗号,处理数据,然后从找到最后一个逗号的位置继续读取。我使用fgetc((,我不确定它是否会更新FILE指针中的最后一个读取位置。
我遵循了这里建议的总体思路,这还不起作用,但已经很接近了。一开始的条件检查似乎效果不佳(EOF(。在复制航空公司名称时,我似乎得到了一个额外的字符,之后它就会崩溃。
// Read data from file, data is comma delimited!
flight* read_from_text()
{
#define DATA_CHUNK 20
FILE *fp;
flight temp_data;
flight *data=malloc(sizeof(*data));
data=&temp_data;
char buffer[DATA_CHUNK];
int c=0,n=0,i=0,state=0;
// Open file for reading
if((fp=fopen("c:\data.txt","r"))==NULL)
{
printf("Error opening flight data file.");
return NULL;
}
// read a single entry from file
while(1)
{
while(((c=fgetc(fp))!=',')||(c=!EOF))
buffer[n++]=(char)c;
if(c==EOF) break;
switch(state)
{
case CODE:
// Check if flight code is valid
if((buffer[0]<'0')||(buffer[0]>'9')||(buffer[1]<'0')||(buffer[1]>'9'))
printf("Error reading in flight numbern");
else
temp_data.code=atoi(buffer);
state++;
break;
case AIRLINE_NAME:
// Check airline name length is OK
if(n>(sizeof(temp_data.airline_name)))
printf("Airline name is too long, some characters will be cutn");
strncpy(temp_data.airline_name,buffer,n);
state++;
break;
case DESTINATION:
if(n>(sizeof(temp_data.destination)))
printf("Destination name is too long, some characters will be cutn");
strncpy(temp_data.destination,buffer,n);
state++;
break;
case RESERVED_SEATS:
temp_data.reserved_seats=atoi(buffer);
state++;
break;
case DATE:
if(n>(sizeof(temp_data.date)))
printf("Date format is too long, might be corruptedn");
strncpy(temp_data.date,buffer,n);
state=0;
break;
}
// Clear buffer
for(i=0;i<DATA_CHUNK;i++)
buffer[i]='n';
n=0;
}
printf("%dn",temp_data.code);
printf("%sn",temp_data.airline_name);
printf("%sn",temp_data.destination);
printf("%dn",temp_data.reserved_seats);
printf("%sn",temp_data.date);
getchar();
return data;
}
您还可以考虑一次逐行读取,并使用类似strtok的东西使用","作为分隔符读取每个子字符串。对于一个简单的程序,这应该是好的。strtok有内部状态,所以你不能将它与其他调用交错,所以它不是线程安全的。或者,您可以检查字符串.h中的函数"index"。它返回一个指针,指向像","这样的字符的第一次出现。
在任何情况下,您都可以使用fgetc构建一个简单的状态机,为了回答您的问题,每个后续调用都将获得文件中的下一个字符。
是的,函数fgetc
会更新读取指针,直到它返回EOF
,指示文件结束。
正是因为这个EOF
,函数fgetc
才返回int
而不是char
。
因此,当存储函数fgetc
的返回值时,请使用int
而不是char
。
如果是EOF
,那么您就知道您已经到达了文件的末尾。
否则,将其转换为char
,然后"按计划"进行。
例如:
FILE* fp = fopen(fileName,"r");
int i;
char c;
while (1)
{
i = fgetc(fp);
if (i == EOF)
break;
c = (char)i;
...
}
fclose(fp);