fscanf总是返回0(已关闭)

时间:2017-04-02 20:07:48

标签: c scanf

我是C编程的初学者,我正在尝试编写一个简单的代码来读取文本文件并将其内容写入数组,然后在控制台上打印。但是,我总是得到0.0000,我无法解决问题。

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

int numOfLines(FILE *fp1);
void printarr(float arr[], int size);
float *filetoArr(FILE *fp, int arrsize);

int main(int argc, const char *argv[]) {
    char *fileName1 = argv[1];
    FILE *fp1 = fopen(fileName1, "r");
    printf("File name: %s", fileName1);
    int size = numOfLines(fp1);
    printf("Number of lines in the file: %d\n", size);
    float *arr = filetoArr(fp1, size);
    printarr(arr, size);
    free(arr);
    fclose(fp1);
}

void printarr(float *arr, int size) {
    for (int i = 0; i < size; i++) {
        printf("%f ", *(arr + i));
    }
}

float *filetoArr(FILE *fp, int arrsize) {
    int size = arrsize;
    float *arr = (float *)malloc(sizeof(float) * size);
    for (int i = 0; i < size; i++) {
        fscanf(fp, "%f\n", (arr+i));
    }
    return (arr);
}

int numOfLines(FILE *fp1) {
    int numberOfLines = 0;
    char c;
    do {
        c = getc(fp1);
        if (c == '\n') {
            numberOfLines++;
        }
    } while (c != EOF);
    return numberOfLines;
}

2 个答案:

答案 0 :(得分:2)

您的numOfLines会转到文件的末尾。

您必须rewind(fp1)将文件句柄重置为位置0,或fscanf命中文件的末尾,并且不会读取任何内容(请查看{{1}的返回码}:它应该是1我打赌你一直都是0)

答案 1 :(得分:1)

您的代码中存在多个问题:

  • 您在numOfLines()中读取了整个文件:您必须使用rewind(fp1);将文件指针重置为文件的开头,以便fscanf()可以读取文件而不是结束文件文件立即。

  • 用于从文件中读取字节的变量c必须定义为int,以便测试文件结尾是否可靠。否则,默认情况下,根据char是否已签名,EOF将永远不会匹配或可能错误地将字符\377与文件末尾匹配。

  • 您不检查是否无法打开文件。

  • 虽然从C99开始为函数main()隐式返回0,但建议明确写出return 0;语句以便更清晰。