我需要从txt文件中做一些操作。 我愿意做的事情:
计算txt中的行数
打开txt文件
迭代每一行
在每一行内迭代并在其中执行任务
关闭文件
当前代码:
textFieldShouldEndEditing
文件采用格式(最大行数1000,每行最大元素数为150)。
每行中的元素数量不同,所以如果我制作一个1000x150的大矩阵,大多数元素都是空的;这就是为什么我不想要一个矩阵,只是想要为每一行执行任务。
int lines(){
FILE *fp = fopen("somedata.txt","r");
int ch;
int count=0;
do{
ch = fgetc(fp);
if( ch== '\n') count++;
}
while( ch != EOF );
fclose(fp);
return count;
}
int main(){
int linesnum=lines();
FILE *fp = fopen("somedata.txt", "r");
if (fp == 0){
fprintf(stderr, "failed to open test0.txt\n");
exit(-1);
}
float areas[linesnum];
for (int j=0;j<linesnum;j++){
float array[150];
for (int i = 0; i < 150; i++){
fscanf(fp, "%f", &array[i]);
if (getc(fp) == (int)'\n'){
//that ends iteration for a line once it founds "\n"
//and assigns its value to temporary array
break;
}
}
//SOME TASK PERFORMED OVER HERE FOR EACH LINE lets say calculate average
if (getc(fp) == EOF){ //That's supposed to be end of iteration through lines
break;
}
}
fclose(fp);
return 0;
}
好吧,我结束了第一行执行任务后出现错误分段错误:11。
我不确定如何在第一次迭代后跳转到下一行。这就是问题所在。
有什么想法吗?
更新:只需摆脱1 2 3 4 5 6
1 3 2 5 6 7 3 5
1 3 3 2 5 2 3
5 3 4 2 52 5 6
中的EOF中断事件:
main()
答案 0 :(得分:1)
这样的事可能有用 用fgets读一行。该线必须足够大以容纳最长的线 使用指向line和offset的指针来解析行中的值 %n将接收sscanf使用的字节数,因此指针可以前进到下一个值。
char line[1500];
char *pline;
int used = 0;
int i = 0;
int linesnum = 0;
float array[150];
while ( fgets ( line, sizeof ( line), fp))) {
pline = line;
i = 0;
while ( ( sscanf ( pline, "%f%n", &array[i], &used)) == 1) {
pline += used;
i++;
if ( i >= 150) {
break;
}
}
linesnum++;
if ( linesnum >= 1000) {
break;
}
}