如何将文本文件的每个单独行读入各自的变量

时间:2013-04-13 13:20:21

标签: c variables

大家好我在第二个周末试图找到解决这个问题的方法。我是c编程的新手,我一直在尝试阅读文本文件的每一行,并将它们中的每一行传递给自己的变量,在那里我将能够操作它们(比如比较它们,做计算等)。 / p>

我有一个代码来读取每一行,但我不确定如何将每一行传递给变量,这里是代码:

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

struct line_reader {
FILE    *f;
char    *buf;
size_t   siz;
};


void
lr_init(struct line_reader *lr, FILE *f)
{
lr->f = f;
lr->buf = NULL;
lr->siz = 0;
}

char *
next_line(struct line_reader *lr, size_t *len)
{
size_t newsiz;
int c;
char *newbuf;

*len = 0;
for (;;) {
    c = fgetc(lr->f);
    if (ferror(lr->f))
        return NULL;

    if (c == EOF) {

        if (*len == 0)
            return NULL;
        else
            return lr->buf;
    } else {

        if (*len == lr->siz) {

            newsiz = lr->siz + 4096;
            newbuf = realloc(lr->buf, newsiz);
            if (newbuf == NULL)
                return NULL;
            lr->buf = newbuf;
            lr->siz = newsiz;
        }
        lr->buf[(*len)++] = c;


        if (c == '\n')
            return lr->buf;
         }
         }
         }


void
lr_free(struct line_reader *lr)
{
free(lr->buf);
lr->buf = NULL;
lr->siz = 0;

}

int
main()
{
struct line_reader lr;
FILE *f;
size_t len;
char *line;

f = fopen("file.txt", "r");
if (f == NULL) {
    perror("foobar.txt");
    exit(1);
}


lr_init(&lr, f);
while (line = next_line(&lr, &len)) {

    fputs("1: ", stdout);
    fwrite(line, len, 1, stdout);
}
if (!feof(f)) {
    perror("next_line");
    exit(1);
}
lr_free(&lr);

return 0;

}

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

如何将数组简单地用作建议

e.g。)

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

char** readFile(const char *filename, size_t *lineCount){
    FILE *fp;
    char buff[4096];
    size_t lines = 0, capacity=1024;
    char **line;

    if(NULL==(fp=fopen(filename, "r"))){
        perror("file can't open.");
        return NULL;
    }
    if(NULL==(line=(char**)malloc(sizeof(char*)*capacity))){
        perror("can't memory allocate.");
        fclose(fp);
        return NULL;
    }
    while(NULL!=fgets(buff, sizeof(buff), fp)){
        line[lines++] = strdup(buff);
        if(lines == capacity){
            capacity += 32;
            if(NULL==(line=(char**)realloc(line, sizeof(char*)*capacity))){
                perror("can't memory allocate.");
                fclose(fp);
                return NULL;
            }
        }
    }
    *lineCount = lines;
    fclose(fp);

    return (char**)realloc(line, sizeof(char*)*lines);
}
void freeMem(char** p, size_t size){
    size_t i;

    if(p==NULL) return;

    for(i=0;i<size;++i)
        free(p[i]);
    free(p);
}

int main(){
    size_t lines;
    char **line;

    if(NULL!=(line=readFile("file.txt", &lines))){//lines: set line count of file
        printf("%s", line[25]);// 26th line of file, zero origin
    }
    freeMem(line, lines);
    return 0;
}

答案 1 :(得分:0)

在任何符合POSIX标准的系统上,只需使用m扫描修改器:

for ( char *line, nl; scanf("%m[^\n]%c",&line,&nl) != EOF ; free(line) ) {
    if ( !line )
        strcpy(line=malloc(1),""), getchar();
    // ...
}

m已经达到标准五年了。