Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 逐行读取文本,并为每行分配变量_C_File_Variables_Line - Fatal编程技术网

C 逐行读取文本,并为每行分配变量

C 逐行读取文本,并为每行分配变量,c,file,variables,line,C,File,Variables,Line,我已经完成了让我的c程序逐行读取文本的任务。这是最简单的部分,至少在我看来是这样。我现在需要做的是为每行分配变量。例如,文本文件的第一行将等于变量line1 还是这个 char line1 = (text from line one) char line2 = (text from line two) 到目前为止,我的代码是: char line[1000] = ""; FILE *ifp; ifp = fopen("Tree-B.txt", "r");

我已经完成了让我的c程序逐行读取文本的任务。这是最简单的部分,至少在我看来是这样。我现在需要做的是为每行分配变量。例如,文本文件的第一行将等于变量line1

还是这个

char line1 = (text from line one)
char line2 = (text from line two)
到目前为止,我的代码是:

    char line[1000] = ""; 

    FILE *ifp;

    ifp = fopen("Tree-B.txt", "r");
    if (ifp == NULL)
    {
        printf("Error opening file!\n");
        exit(1);
    }

    while (fscanf(ifp, "%s", line) == 1)
    {
        printf("%s ", line);
    }
    printf("\n");
    fclose(ifp);

    return 0;

我完全不知道该怎么做。

你可以用一个指针数组来解决这个问题

char line[1000] = "";  // assume each line has at most 999 chars (1 space for NUL character)
char *lines[1000] = { NULL }; // assume max number of lines is 1000
int idx = 0;
FILE *ifp;

ifp = fopen("q2.cpp", "r");
if (ifp == NULL)
{
    printf("Error opening file!\n");
    exit(1);
}

while(fgets(line, sizeof(line), ifp) != NULL)
{
    lines[idx] = strdup(line);
    printf("%s", lines[idx]);
    idx++;
}
注:

这种方法使用的是不是POSIX官方C标准的strdup。但是,您可以将strdup函数本身放入其中

fgets比fscanf更受欢迎,所以我改变了这种方式

1000 limis是具有启发性的-您可以/应该将这些常量更改为程序本身更有意义的值


如果要为文件内容动态分配内存,您可以引用。

您可以使用数组。您需要使用malloc或数组行[1000][1000]进行分配,但这仅限于1000行和999个字符。@Stargateur为什么999个字符,为什么不1000个?fscanfifp,%s,行不节省空间。读单词比读句子更有用。可以使用FGET代替。
#include <stdio.h>

#define MAX_LINES 1000
#define MAX_LINE_LENGTH 200

int main()
{
    char fileContents[MAX_LINES][MAX_LINE_LENGTH];
    int lineCount = 0;

    FILE *ifp = fopen("Tree-B.txt", "r");
    if (ifp == NULL)
    {
        printf("Error opening file!\n");
        exit(1);
    }

    while (fgets(fileContents[lineCount++], MAX_LINE_LENGTH, ifp) != NULL);
    fclose(ifp);

    printf("File Contents:\n");
    for (int i = 0; i < lineCount-1; ++i)
    {
        printf("%s", fileContents[i]); // or fputs
    }

    return 0;
}