Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C中用分号分隔的文本文件中读取不同的数据_C_Text_File_Input - Fatal编程技术网

从C中用分号分隔的文本文件中读取不同的数据

从C中用分号分隔的文本文件中读取不同的数据,c,text,file,input,C,Text,File,Input,在C语言中,如何将用分号分隔的不同数据记录读入数组 从文本文件:文本一;12.25; 文本二;5.文本三;1.253 一种方法是使用。然后在int或float中键入结果。通常的建议是读取整行内容,然后用sscanf或strtok或其他方法对其进行解析。如果直接从输入文件中搜索,则很容易丢失在输入文件中的位置。i、 e.当某些内容第一次不匹配时,您需要一种跳过它的方法,除非您只想在那里中止。我将使用fgets从文件中读取一行,strtok在分号上打断它,strcpy复制字符串,strtod转换为d

在C语言中,如何将用分号分隔的不同数据记录读入数组

从文本文件:文本一;12.25; 文本二;5.文本三;1.253


一种方法是使用。然后在int或float中键入结果。

通常的建议是读取整行内容,然后用sscanf或strtok或其他方法对其进行解析。如果直接从输入文件中搜索,则很容易丢失在输入文件中的位置。i、 e.当某些内容第一次不匹配时,您需要一种跳过它的方法,除非您只想在那里中止。

我将使用fgets从文件中读取一行,strtok在分号上打断它,strcpy复制字符串,strtod转换为double,strtol转换为long,然后向下转换为整数

或者,读取该行并使用状态机遍历每个字符并执行正确的操作。例如,您要将每个字符复制到firstText中,直到达到分号,然后使用strtod吃双精度,跳过分号,将字节复制到secondText,等等

或者,使用单个scanf格式字符串将行分解为所有字段

fscanf(myFile, " %[^;];%lf;%[^;];%d;%[^;];%lf", 
    myRecords[i].firstText,
    &myRecords[i].myDouble1,
    myRecords[i].secondText,
    &myRecords[i].myInt1,
    myRecords[i].thirdText,
    &myRecords[i].myDouble2);
并且,正如其他人提到的,检查fscanf的返回值


我更喜欢一次读一行,以避免一行不好的行导致后面的所有转换出错。

如果将每个字段作为字符串%[^;];,例如,您是否在第二个字段中获得了正确的文本12.25?没有。问题是我正在将其读入具有固定类型的structarray中。我尝试了它,它工作正常。您能显示myRecord结构的定义吗?结构myRecord{char text1[20];双倍价格;char text2[30];int nr;char text3[30];双倍价格2;};怎么会出错?你为什么不检查fscanf的返回值?你的位置怎么容易丢失?跳过该行的其余部分并不困难,如果将当前行抛出错误,则只需执行以下操作:void ignorelineFILE*f{char c;for;;switch fgetcf{case'\n':case EOF:return;default:;}。
fscanf(myFile, " %[^;];%lf;%[^;];%d;%[^;];%lf", 
    myRecords[i].firstText,
    &myRecords[i].myDouble1,
    myRecords[i].secondText,
    &myRecords[i].myInt1,
    myRecords[i].thirdText,
    &myRecords[i].myDouble2);