【问题标题】:reading lines from text file into array将文本文件中的行读入数组
【发布时间】:2019-05-06 23:31:11
【问题描述】:

我有一个包含以下行的文本文件:

(0,0) -180.000  77.500  -999.000  -999.000  -999.000  2740.831  45.000  -0.001  -0.001  0.000 458.138 45.000  -999.000
(1,0) -179.500  77.500  -999.000  -999.000  -999.000  2740.831  45.000  -0.001  -0.001  0.000 458.138 45.000  -999.000
(2,0) -179.000  77.500  -999.000  -999.000  -999.000  2740.831  45.000  -0.001  -0.001  0.000 458.138 45.000  -999.000
(3,0) -178.500  77.500  -999.000  -999.000  -999.000  2740.831  45.000  -0.001  -0.001  0.000 458.138 45.000  -999.000
...
...
(359,0) -0.500  77.500  -999.000  -999.000  -999.000  2740.831  45.000  -0.001  -0.001  0.000 458.138 45.000  -999.000

我正在尝试使用以下程序将此文本文件 (buf) 的每一行放入数组 (buffarray) 的单个元素中:

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

#define PI 4*atan2(1,1)

int main(int argc, char *argv[]) {
    FILE *fp;
    char buf[200];
    char *token;
    char buffarray[223920];
    char filename[150];
    int i, j, k;

    sscanf(argv[1], "%s", filename);

    if ((fp = fopen(filename, "rt")) == NULL) {
        printf("Failed in fopen: %s\n", filename);
        return -1;
    }

    while (!feof(fp)) {
        fgets(buf, 200, fp);
        token = buf;
        printf("buf is %s\n", buf);     
        buffarray++ = token;
    }
}

每次编译这个程序时我都会收到一条错误消息:

translate_ww3file.c: In function ‘int main(int, char**)’:
translate_ww3file.c:30:12: error: lvalue required as increment operand
   buffarray++ = token;
        ^

我该如何解决这个问题?理想情况下,我想创建另一个文本文件,其中重新排列行,以便原始文本中的第 180 到 359 行首先在新文本文件中打印,然后在新文本文件中打印第 1 到 179 行。

【问题讨论】:

标签: c arrays file


【解决方案1】:

多个问题:

  • PI 宏没有正确括起来。应该是#define PI (4*atan2(1,1))
  • while (!feof(fp)) 总是错的。请改用while (fgets(buf, 200, fp))
  • 您不能递增数组,您想将数组末尾的字符串与strcat(buffarray, token); 连接,但您必须在循环之前将buffarray[0] 初始化为'\0'

这是一个更正的版本:

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

#define PI  (4*atan2(1,1))

int main(int argc, char *argv[]) {
    FILE *fp;
    char buf[200];
    char *token;
    char buffarray[223920];
    char filename[150];

    if (argc < 2 || sscanf(argv[1], "%149s", filename) != 1) {
        printf("missing command line argument\n");
        return 1;
    }

    if ((fp = fopen(filename, "rt")) == NULL) {
        printf("Failed in fopen %s: %s\n", filename, strerror(errno));
        return 1;
    }

    *buffarray = '\0';
    while (fgets(buf, sizeof buf, fp)) {
        token = buf;
        printf("buf is %s\n", buf);     
        strcat(buffarray, token);
    }
    fclose(fp);

    printf("file contents:\n);
    fputs(buffarray, stdout);
    return 0;
}

【讨论】:

  • 注:替代#define PI (4*atan2(1,1)) --> acos(-1)
  • @chux:确实是的。我想知道为什么标准不要求在&lt;math.h&gt; 中定义目标浮点表示的最佳近似值。 PI 无论如何都没有在发布的代码中使用:)
  • 当我在上面的程序中制作数组时。我怎样才能设置它,以便我可以打印出 buffarray[i] 例如。如果我想打印出数组的一个元素,我该怎么做?
  • @jms1980:如果您的目标是解析文本文件,将文本转换为数字,则该方法不合适。您可能应该使用sscanf() 将该行转换为一组值,然后将其存储在结构数组中。你能澄清一下问题吗?
猜你喜欢
  • 2015-08-18
  • 2010-12-20
  • 1970-01-01
  • 2017-07-16
  • 2020-01-20
  • 2010-09-29
  • 1970-01-01
相关资源
最近更新 更多