简单分享-获取.txt文件内数据 文件内数据逗号分隔 分隔符 C语言
数据存储到文件中,把文件数据读取到数组,方便数据处理。
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
#define DATANUM 307200 //数组个数
int main() {
unsigned short array[DATANUM];
FILE *file;
file = fopen("data.txt", "r"); // 替换为您的文件名 在该.C在文件夹下
long int position =0;
int index = 0,t=0;
if (file == NULL) {
perror("无法打开文件");
return EXIT_FAILURE;
}
char buffer[100000]; //获取文件字符串
while (fgets(buffer, sizeof(buffer), file)) {
int k=0;
long recodestart=0;
/*
当调用strtok()时,它会查找输入字符串中第一个出现的分隔符,并将其替换为\0(空字符),从而结束当前标记。
每次成功调用后,strtok()返回指向被分割出的子字符串的指针。如果没有更多可提取的子字符串,则返回NULL。
第一次调用时,提供待分解的字符串。
*/
char *token = strtok(buffer, ","); //如果文件分隔符是空格把“,”换成“ ”就好
while ( index < DATANUM) { //token != NULL &&
if(token != NULL) //
{
if(t==1)
{
t=0;
index=index-1; //如果buffer取字符串刚好取到数据的一半,则存储的数组需要抛弃上一个数据 ,例如:数据65535,buffer最后只取到65,数组就会保存65。这个数组就是异常的,需要去掉。
}
}
array[index++] = atoi(token);
token = strtok(NULL, ",");
if(token == NULL) //如果采集不到分隔符号“,”返回NULL
{
if(buffer[99998] != NULL) //buffer[99999]='\0' ,buffer最后取字符如果不是分隔符“,” ,则需要往后退,确保下次取的是完整的数据
{
while(buffer[99998-k] != NULL)
{
k++;
printf("buffer[99998-%d]=%c\n",k,buffer[99998-k]);//用于调试可屏蔽
}
t=1; //如果buffer取字符串刚好取到数据的一半,则存储的数组需要抛弃上一个数据 ,例如:数据65535,buffer最后只取到65,数组就会保存65。这个数组就是异常的,需要去掉。
}
else
k=0;
printf("k=%d ",k); //用于调试可屏蔽
position = ftell(file); //查看文件指针位置 //用于调试可屏蔽
printf("F=%ld ",position);//用于调试可屏蔽
recodestart += (99999-k);
fseek(file, (long)(recodestart), SEEK_SET);//将文件指针移到指定位置
position = ftell(file); //用于调试可屏蔽
printf("E=%ld\n",position);//用于调试可屏蔽
fgets(buffer, sizeof(buffer), file);//从当前文件指针位置获取1000000字符到buffer
token = strtok(buffer, ","); //提供待分解的字符串
k=0;
}
}
// 可以在这里对array进行进一步处理,例如打印或计算等
}
fclose(file);
///
//将采集的数组打印出来,用文件对比工具对比,数组是否正确
//以下代码用于调试可屏蔽
///
int i=0;
FILE *destFile = fopen("data2.txt", "w"); //创建.ini文件
if (destFile == NULL) {
perror("Error opening destination file"); //创建文件失败提示
return EXIT_FAILURE;
}
for(i=0;i<DATANUM;i++)
{
fprintf(destFile, "%d,",array[i]);
}
fclose(destFile); //关
printf("complete\n");
return EXIT_SUCCESS;
}
运行结果
文件对比结果