跳转到C中的.txt文件中的下一行

时间:2015-04-26 20:10:43

标签: c arrays text

我需要从txt文件中做一些操作。 我愿意做的事情:

  1. 计算txt中的行数

  2. 打开txt文件

  3. 迭代每一行

  4. 在每一行内迭代并在其中执行任务

  5. 关闭文件

  6. 当前代码:

    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()

1 个答案:

答案 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;
    }
}