0

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

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

#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;

}

任何帮助,将不胜感激。

4

2 回答 2

0

简单地使用数组作为建议怎么样?

例如)

#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;
}
于 2013-04-13T14:06:33.177 回答
0

在任何符合 POSIX 的系统上,只需使用mscan 修饰符:

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

m已经符合标准五年了。

于 2013-04-13T16:44:49.470 回答