чтение строк из текстового файла в массив - PullRequest
1 голос
/ 07 мая 2019

У меня есть текстовый файл, который имеет следующие строки:

(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 печатались впоследствии в новом текстовом файле.

1 Ответ

3 голосов
/ 07 мая 2019

Множество проблем:

  • макрос 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...