2016-08-11 5 views
0

У меня есть функция, которая принимает поток файлов и считывает целые числа, хранящиеся в этом файле, в 1D-матрицу. Проблема, с которой я сталкиваюсь, заключается в том, что мой fscanf последовательно возвращает 0, а не 1, как я ожидаю. Я знаю, что начало моего файла отформатировано правильно и, как ожидалось, но я не могу понять, почему он не будет читать самую первую строку. Что я делаю не так?fscanf постоянно возвращает 0, когда он должен возвращаться 1

/* FUNCTION: readToMatrix 
    DESCRIPTION: 
     This takes an input stream and reads the file (as described in the header documentation), 
     filling the array with the integers contained in the input file stream. 
    INPUTS: 
     file stream, int *array, matrix width 
    OUTPUTS: 
     Writes to array 
    RETURN: 
     Returns 0 on success, nonzero on an unexpected failure. 
*/ 

int readToMatrix(FILE *input, int *array, size_t matWidth) 
{ 
    int x,y; 
    long num; 

    for (y = 0; y < matWidth; ++y) 
    { 
     for (x = 0; x < matWidth-1; ++x) 
     { 
      // if fscanf doesn't read 1 number or if EOF then return 
      if (fscanf(input, "%ld,", &num) != 1 || feof(input)) return -1; 
      array[x + y*matWidth] = num; 
     } 
     if (fscanf(input, "%ld ", &num) != 1 || feof(input)) return -1; 
     array[x + y*matWidth] = num; 
    } 
    return 0; 
} 

ПРИМЕЧАНИЕ. Ниже приведен короткий фрагмент начала входного файла.

12177,12690,12499,12985,13005,12574,12882,12896,13026,14539,13704,13539,15182,14361,14539,15333,14615,15231, 
+0

Где вы открыть файл? – ameyCU

+0

Файл был открыт в вызываемой функции. – LTClipp

+0

Какой вызов fscanf? – immibis

ответ

0

У меня возникла проблема. По какой-то причине передача потока файлов в функцию не работала. Когда я создал функцию, создающую поток файлов и открываю файл в самой функции (как это и должно быть), все работает отлично.

+0

Что значит «не работает»? Можете ли вы проиллюстрировать свой собственный ответ на свой собственный вопрос, и это не будет «работой для ничего»? –

1

Есть некоторые небольшие проблемы в вашей петле. исправить это, то он может работать правильно:

#include<stdio.h> 
int readToMatrix(FILE *input, int *array, size_t matWidth , size_t matHeight) 
{ 
    int x,y; 
    long num; 
    for (y = 0; y < matHeight; y++) 
    { 
     for (x = 0; x < matWidth; x++) 
     { 
      // if fscanf doesn't read 1 number or if EOF then return 
      if (fscanf(input, "%ld,", &num) != 1 || feof(input)) return -1;  
      array[x + y*matWidth] = num; 
     }  
    }  
    return 0; 
} 
int main() 
{ 
    FILE *fd; 
    int matWidth = 5 ; 
    int matHeight = 5; 
    int array[18]; 
    int i; 
    fd=fopen("matrix.txt","r"); 
    if(fd == NULL) 
    { 
     printf("open failed!\n"); 
    } 
    else 
    { 
     readToMatrix(fd, array, matWidth , matHeight); 
     fclose(fd); 
    } 
    for(i=0;i<18;i++) 
    { 
     printf("%d:%d\n",i,array[i]); 
    } 
    return 0; 
} 

здесь matrix.txt:

12177,12690,12499,12985,13005,12574,12882,12896,13026,14539,13704,13539,15182,14361,14539,15333,14615,15231 

выход: 0: 12177 1: 12690 2: 12499 3: 12985 4 : 13005 5: 12574 6: 12882 7: 12896 8: 13026 9: 14539 10: 13704 11: 13539 12: 15182 13: 14361 14: 14539 15: 15333 16: 14615 17: 15231

+0

Нет, мои петли были правильными. Матрица ограничена квадратом, поэтому размеры x и y будут одинаковыми. – LTClipp

+0

@UnclePutin, пожалуйста, попробуйте мой код этой версии, он может читать «,» как разделитель. –

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