2015-08-05 2 views
-1

Мне нужно прочитать неопределенную матрицу из текстового файла на языке C, и я хочу прочитать ее по строкам, чтобы каждая строка была целым массивом. Но как я знаю где конец строки, так как я не могу использовать «\ n» для символов? Вот код:Конец целочисленной строки в C

#include "stdafx.h" 
#include "stdlib.h" 
#include "stdio.h" 

using namespace System; 

typedef struct 
{ 
    int *v; 
    int n; 
}vector; 



int main(array<System::String ^> ^args) 
{ 
    vector *a; 
    FILE* f; 
    int n = 15; 
    int i = 0; 
    int j,k; 
    if ((f = fopen("C:\\Users\\Mirelaa\\Documents\\visual studio 2013\\Projects\\MatriceNedefinita\\MatriceNedefinita\\Debug\\fisier2.in", "rt")) == NULL) 
    { 
     printf("Fisierul nu poate fi deschis!"); 
     exit(1); 

    }; 

    a = (vector *)malloc(n * sizeof(vector)); 

    while (!feof(f)) 
    { 
     a[i].v = (int*)malloc(n * sizeof(int)); 
     a[i].n = 0; 
     //citeste rand 
     //citesti fiecare element din rand 
     j = 0; 
     while (a[i].v[j] != '\0')// wrong!! 

     { 
      fscanf(f, "%d", &a[i].v[j]); 
      j++; 
      a[i].n = a[i].n + 1; 
     } 
     for (k = 0 ; k < a[i].n ; k++) 
     { 
      printf("%d", a[i].v[j]); 
      printf("\n"); 
     } 
     i++; 
     if (i == n) 
     { 
      n = 2 * n; 
      a = (vector *)realloc(a, n * sizeof(vector)); 
      a[i].v = (int *)realloc(a[i].v, n * sizeof(int)); 
     } 
    } 
    return 0; 
} 
+1

Читайте в строке за раз, а не по целому ряду ... затем прочитайте свои строки из этой строки. 'fgetln()' возможно. – mah

+1

Прежде всего, [в C вы не должны указывать результат 'malloc'] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). Затем цикл, подобный 'while (! Feof (...))' редко работает так, как ожидалось, поскольку флаг 'EOF' не установлен до тех пор, пока вы не попытаетесь прочитать из-за конца файла. –

+7

Подпись 'main' определенно ** не ** C. – user3386109

ответ

0

Я прочитал в линии с fgets ... (смотри, например, here)

char *fgets(char *str, int n, FILE *stream) 

вы можете прочитать строку до $ N $ символов в линии строка.

Этот метод дает вам способ индивидуальной загрузки каждой строки в строку.

Редактировать после хорошего комментария

Это легче разбить строку с strtok, а затем использовать atoi преобразовать каждый бит строки в целое (а не использовать sscanf, как в моем оригинал ответ).

+1

Использование 'sscanf' для чтения неизвестного числа целых чисел будет проблемой. Использование 'strtok' и' atoi' будет работать лучше. –

+0

@RSahu - спасибо за полезный комментарий - ответ отредактирован, и я вижу, что ваш метод ** много ** лучше – tom

1

Чтение строки целых чисел и сохранение в массиве с переменным размером - это один подход.

Проблема с fscanf(f, "%d",... заключается в том, что она сначала считывает пробел, а код теряет нахождение '\n'. Код должен искать его другими способами.

Но вместо того, чтобы упаковать весь код в main(), рассмотрите вспомогательные функции. Следующая функция C считывает одну строку цифр и возвращает NULL на 1) из памяти, 2) отсутствие данных или сбой преобразования без чтения чисел. В противном случае верните vector. Он не ограничен какой-либо длиной линии.

typedef struct { 
    int *v; 
    size_t n; 
} vector; 

vector *Read_vector(vector *v1, FILE *inf) { 
    v1->v = NULL; 
    v1->n = 0; 
    size_t size = 0; 
    for (;;) { 
    int number; 
    int ch; 
    // Check leading white-space for \n 
    while (isspace(ch = fgetc(inf))) { 
     if (ch == '\n') break; 
    } 
    if (ch == '\n' || ch == EOF) break; 
    ungetc(ch, inf); 
    if (1 != fscanf(inf, "%d", &number)) { 
     break; 
    } 
    // Is `v1` large enough? 
    if (v1.n >= size) { 
     size = size*2 + 1; 
     vector nu; 
     nu.v = realloc(v1->v, size * sizeof *nu.v); 
     if (nu.v == NULL) { 
     free(v1->v); 
     v1->v = NULL; 
     v1->n = 0; 
     return NULL; 
     } 
     v1->v = nu.v; 
    } 
    v1.v[v1.n++] = number; 
    } 
    if (v1->n == 0) { 
    return NULL; 
    } 
    return v1; 
} 

С повторными вызовами может быть принят массив векторов. Оставьте это OP, так как это очень похоже на вышеизложенное.

Примечание: избегать использования while (!feof(f)).

Смежные вопросы