Как читать в текстовом файле целых чисел, разделенных табуляцией в C? - PullRequest
3 голосов
/ 18 марта 2011

У меня есть файл, состоящий из целых чисел, разделенных табуляцией (файл .txt), и я хочу прочитать их просто C, строка за строкой.Итак, скажем, каждая строка имеет 5 целых чисел.Как мне это сделать?

Моя первая попытка была следующей.Это было просто читать в одно целое число, но даже это не сработало:

    FILE *fp;
    char blah[255];
    int *some_int;
fp = fopen("test.txt", "rt");
while (fgets(blah, 255, fp) != NULL)
{
    sscanf(blah, "%d", some_int);
    printf("%d\n", *some_int);
}

Ответы [ 3 ]

3 голосов
/ 18 марта 2011

Вот способ, который никто другой не предложил, который не использует fscanf, поэтому вы можете иметь вменяемую обработку ошибок:

char buffer[BUFSIZE];
size_t size = 5;
int *data = malloc(size * sizeof *line);

if(line == NULL) error();

while(fgets(buffer, sizeof buffer, fp)
  {
    size_t i = 0;
    char *next = buffer;
    while(*next && *next != '\n')
      {
        data[i++] = strtol(next, &next, 0);
        // check for errors
      }
  }

По сути, вместо попытки использовать *scanf '* "%d" чтобы читать символы, используйте функцию, которую она (вероятно) вызывает для преобразования: strtol.Где *scanf проходит через строку, чтобы соответствовать строке формата, но не позволяет вам «сохранить свое место» между вызовами функций, strtol делает, что вам нужно для чтения произвольного числа целых чисел.

Я написал не весь ваш код для вас - вы должны выполнить сложную обработку ошибок.Возможные ошибки:

  1. i == size, в этом случае вы можете попытаться увеличить data с помощью realloc.С другой стороны, вы можете перебрать буфер и посчитать, сколько чисел существует заранее, а затем распределить их так, чтобы вам не нужно было перераспределять их позже.
  2. fgets не прочитал всю строку (проверьте, чтопоследний символ перед '\0' является '\n').В этом случае вы, вероятно, захотите заполнить буфер и продолжить чтение чисел.Будьте осторожны в этом случае - вам, вероятно, придется вернуться и пересчитать последнее число - fgets могло бы его обрезать.(Это один из недостатков использования fgets.)
  3. Ошибочный ввод - обрабатывайте как хотите.
2 голосов
/ 18 марта 2011
#include <stdio.h>
int main(){
    FILE *fp;
    int scanned = 0;
    int some_ints[5];
    fp = fopen("test.txt", "r");
    while ((scanned = fscanf(fp, "%d %d %d %d %d", some_ints, some_ints+1, some_ints+2, some_ints+3, some_ints+4)) !=  EOF) {
        if(scanned ==5){
            printf("%d %d %d %d %d\n", some_ints[0], some_ints[1], some_ints[2], some_ints[3], some_ints[4]);
        }
        else {
            printf("Whoops! Input format is incorrect!\n");
            break;
        }
    } 
}
1 голос
/ 18 марта 2011

Я бы сделал что-то вроде этого:

int storedVals[MAX_STORED_VALS];
int bf;
int ii=0;

while (!feof(fp) && ii<MAX_STORED_VALS) {
  if (fscanf(fp," %d",&bf)) {
    storedVals[ii++]=bf;
  }
}

fscanf автоматически выполняет обрезку пробелов. Таким образом, до тех пор, пока в вашей строке сканирования есть пробел, он избавится от нуля или более \ t (табуляции) и \ n (строки), чтобы найти следующее целое число. Конечно, это не очень помогает в исправлении ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...