如何从文本文件中读取值并将它们存储在C中的不同变量类型中

时间:2017-03-06 16:56:52

标签: c file

我需要将包含7行的文本文件读入7个不同的变量。文本文件如下所示:

.2661
A.txt
B.txt
C.txt
1
2
0.5 0.6 

这些是我需要将每一行存储到的变量:

float value1;             // line 1 from .txt file
char *AFileName;          // line 2 from .txt file
char *BFileName;          // line 3 from .txt file
char *CFileName;          // line 4 from .txt file
int value2;               // line 5 from .txt file
int lastLineLength;       // line 6 from .txt file
double lastLine[lastLineLength];    // line 7 from .txt file - this can be different lengths

我目前通过在命令行和argv命令中调用程序时使用参数来执行此操作。

2 个答案:

答案 0 :(得分:1)

首先使用具有读取权限的fopen打开文件:

FILE *inputFile = fopen(filename, "r");
if(!inputFile) {
    // Error opening file, handle it appropriately.
}

然后使用fscanf从文件中读取数据。第一个参数是我们在上面创建的FILE *。第二个参数是一个格式字符串,用于指定在读取文件时fscanf应该期望的内容。其余参数是指向将保存从文件读取的数据的变量的指针。

int variablesFound;
variablesFound = fscanf(inputFile, "%f\n%s\n%s\n%s\n%d\n%d\n", &value1, AFileName, BFileName, CFileName, &value2, &lastLineLength);
if(variablesFound < 6) {
    // There was an error matching the file contents with the expected pattern, handle appropriately.
}

double lastLine[lastLineLength];

// Iterate over the last line.
int lastLineIndex;
for(lastLineIndex = 0; lastLineIndex < lastLineLength; lastLineIndex++) {
    fscanf(inputFile, "%lf", &lastLine[lastLineIndex]);
    fscanf(inputFile, " ");  // Eat the space after the double.
}

修改

在评论之后,我意识到可能值得注意的是,你必须将内存分配给你的变量作为真正的第一步。原语(下面有&的原语)可以声明为正常。对于字符串(char数组),您需要执行以下操作之一:

char *aFileName = calloc(MAX_FILENAME_SIZE + 1, sizeof(char));

char aFileName[MAX_FILENAME_SIZE + 1];

取决于您aFileName的目的是什么决定哪种方法适合。但是,假设此代码出现在main中或者不需要存在于函数范围之外,后者会更好,因为它不需要free()变量后的变量完成它。

如果您的需求经常变化,单挑处理读取输入的代码也可能是值得的。

答案 1 :(得分:0)

您可以按如下方式从文件中读取:

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

int main(void)
{
    FILE * fp;
    char * line = NULL;
    size_t len = 80;

    fp = fopen("<path to your file>", "r");
    if (fp == NULL)
        exit(-1);

    while (getline(&line, &len, fp) != -1) 
        printf("%s", line);


    fclose(fp);
    return 0;
}

getline从文件中读取字符串,因此您必须根据需要解析这些行(atoi,atof)。