gpt4 book ai didi

c - 从C中的逗号分隔文本文件中读取各种长度的数据

转载 作者:行者123 更新时间:2023-11-30 17:36:48 38 4
gpt4 key购买 nike

我有一个 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 number\n");
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 cut\n");
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 cut\n");
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 corrupted\n");
strncpy(temp_data.date,buffer,n);
state=0;
break;
}

// Clear buffer
for(i=0;i<DATA_CHUNK;i++)
buffer[i]='\n';
n=0;
}

printf("%d\n",temp_data.code);
printf("%s\n",temp_data.airline_name);
printf("%s\n",temp_data.destination);
printf("%d\n",temp_data.reserved_seats);
printf("%s\n",temp_data.date);
getchar();

return data;
}

最佳答案

您还可以考虑一次逐行阅读并使用诸如 strtok 之类的东西使用“,”作为分隔符读取每个子字符串。对于一个简单的程序来说,这应该是好的。 strtok 具有内部状态,因此您不能将其与其他调用交错,因此它不是线程安全的。或者,您可以查看 strings.h 中的函数“index”。它返回一个指向第一次出现的字符(如“,”)的指针。

无论如何,您都可以使用 fgetc 构建一个简单的状态机并回答您的问题,每个后续调用都将获取文件中的下一个字符。

关于c - 从C中的逗号分隔文本文件中读取各种长度的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22570212/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com