使用C中的fget将文本文件解析为多个变量

时间:2018-08-09 14:02:02

标签: c linux fgets

我的目标是从文本文件中的C中创建两个变量,以供稍后在代码中使用。我的第一个变量将是第1、3、5、7行等中的数据。第二个变量将是来自第2、4、6行的数据,依此类推。

主要功能:

#include <stdio.h>

int main() {
    FILE *file;
    char buf[500];
    file = fopen("ANTdata.txt", "r");

    if (!file) {
        return 1;
    }
    while (fgets(buf, 500, file) != NULL) {
        printf("%s", buf);
    }
    fclose(file);
    return 0;
}

文本文件示例:

 0.0002746660
-0.0013733300
-0.0002136290
-0.0002746660
 0.0021362900
-0.0006103680
 0.0006103680
-0.0022583600
-0.0011291800
-0.0005798500
 0.0000000000
-0.0001831100
 0.0000915552
-0.0015259200

3 个答案:

答案 0 :(得分:1)

使用fscanf()可以轻松解决您的问题:

#include <stdio.h>

int main() {
    FILE *file;
    double x1[1000], x2[1000];
    int n;

    file = fopen("ANTdata.txt", "r");
    if (!file) {
        return 1;
    }
    for (n = 0; n < 1000 && fscanf(file, "%lf%lf", &x1[n], &x2[n]) == 2; n++)
        continue;

    fclose(file);

    /* arrays x1 and x2 have `n` elements, perform your computations */
    ...

    return 0;
}

如果您只想一次使用不同的功能处理两条线,这是一个简单的解决方案:

#include <stdio.h>
#include <string.h>

void my_function(const char *line1, const char *line2) {
    printf("x: %s, y: %s\n", line1, line2);
}

int main() {
    FILE *file;
    char line1[250], line2[250];

    file = fopen("ANTdata.txt", "r");
    if (!file) {
        return 1;
    }
    while (fgets(line1, sizeof line1, file) && fgets(line2, sizeof line2, file)) {
        /* strip the trailing newlines if any */
        line1[strcspn(line1, "\n")] = '\0';
        line2[strcspn(line2, "\n")] = '\0';
        my_function(line1, line2);
    }
    fclose(file);
    return 0;
}

答案 1 :(得分:0)

这是一个简单的答案(可以改进):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    FILE * fp;
    fp = fopen("ANTdata.txt", "r");

    char * line;
    char oddLine[100];
    char evenLine[100];

    if (fp == NULL)
        exit(EXIT_FAILURE);

    int i = 0;
    int endOfFile = 1;
    int res = 0;
    size_t len = 0;
    while(endOfFile)
    {
        if(i % 2 == 0){
            res = getline(&line, &len, fp);
            strcpy(evenLine, line);
            printf("even : %s", evenLine);
        }else{
            res = getline(&line, &len, fp);
            strcpy(oddLine, line);
            printf("odd : %s", oddLine);
        }
        if(res == -1)
            endOfFile = 0;
        i++;
    }
    fclose(fp);

    return 0;
}

输出为:

even : 0.0002746660
odd : -0.0013733300
even : -0.0002136290
odd : -0.0002746660
even :  0.0021362900
odd : -0.0006103680
even :  0.0006103680
odd : -0.0022583600
even : -0.0011291800
odd : -0.0005798500
even :  0.0000000000
odd : -0.0001831100
even :  0.0000915552
odd : -0.0015259200
even : -0.0015259200

答案 2 :(得分:0)

您可以使用strtod将浮点值的文本表示形式转换为浮点数:

#include <stdlib.h>
...
char *chk;
double x = strtod( buf, &chk );

chk将指向第一个转换为 not 的字符-如果该字符不是空格或字符串终止符,则您的输入不是有效的浮点常量:

if ( !isspace( *chk ) && *chk != 0 )
{
  // bad input, handle as appropriate
}

如果您不想打扰错误检查(您知道您的输入文件很好),则可以将NULL作为第二个参数。

如何处理将哪个输入分配给哪个变量取决于您。如果要保留当前的循环结构(读取有效输入时循环),则需要一种方法来跟踪您所在的行,然后根据该行进行决策。这是一种(有些脆弱)的方法:

int xvals[N], yvals[N];

int row = 0, i = 0;
while ( fgets ( buf, sizeof buf, file ) )
{
  if ( ++row % 2 ) // row is odd
    xvals[i] = strtod( buf, NULL ); // error checking omitted for brevity
  else
    yvals[i++] = strtod( buf, NULL ); // advance i after both x and y are read

  ...
}