【问题标题】:Assigning each line of a file into each element of an array将文件的每一行分配给数组的每个元素
【发布时间】:2015-03-03 21:12:11
【问题描述】:

我对 C 编程很陌生,刚刚开始研究文件。我想知道是否可以将文件逐行(包括每行中的空格)读入一个大小等于文件中行数的数组中。我真的不知道从哪里开始,或者这是否可能,所以任何指导都将不胜感激。

示例

以下形式的文本文件:

Computer Programming
Software Engineering
Computer Architecture

写入数组,这样:

char array[4];

array[0] = "Computer Programming";
array[1] = "Software Engineering";
array[2] = "Computer Architecture";

到目前为止,我只有:

int main()
{
    char array[50];
    bool answer;

    FILE *classes;
    classes = fopen("classnames.txt", "r");

    if(classes == NULL){
        printf("\n ************* ERROR *************\n");
        printf("\n \"classnames.txt\" cannot be opened.\n");
        printf("\n         PROGRAM TERMINATED\n");
        exit(EXIT_FAILURE);
    }

接下来我想将每个类名写入数组的每个元素中。

【问题讨论】:

  • 请张贴array的声明。以及从文件中读取的代码。
  • I'm wondering whether it is possible... 是的,有可能,但这是寻找解决方案的错误站点
  • 假设arraychar **,你可以使用getline
  • 您所拥有的array 声明恰好是四个字符,而不是您想要的三个字符数组。

标签: c arrays file


【解决方案1】:

是的,您只需将array 声明为char** 并在您阅读每一行时动态分配。例如

int MAX_NUM_LINES = 1000;
int MAX_LINE_LEN = 256;

char** array;
malloc(array, MAX_NUM_LINES*sizeof(char*));
fp = fopen(...);

int line_ct = 0;
char line[MAX_LINE_LEN];
while ( fgets(line, MAX_LINE_LEN, fp) != NULL )
{
   int len = strlen(line);
   malloc(array[line_ct], len * sizeof(char));
   strcpy(array[line_ct], line);
   line_ct++;
}

我实际上并没有尝试编译此代码,但类似这样的东西会起作用。您还可以通过先快速运行并计算行数来将 MAX_NUM_LINES 替换为实际值——这可能会更好。

【讨论】:

  • while 循环应该是 while ( fgets(line, MAX_LINE_LEN, fp) != NULL )。请参阅this post 了解更多信息。
  • @user3386109 哇,这个帖子很棒,谢谢。我确实已经去编辑了这篇文章。
【解决方案2】:

这是一个可能的方法的例子

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

int main()
{
    char        array[100][100];
    char        line[100];
    size_t      arraySize;
    size_t      count;
    FILE       *file;
    const char *filepath;

    filepath = "<put the file path here>";
    file     = fopen(filepath, "r");
    if (file == NULL)
     {
        perror("fopen()");
        return -1;
     }

    count     = 0;
    arraySize = sizeof(array) / sizeof(array[0]);
    while ((fgets(line, sizeof(line), file) != NULL) && (count < arraySize))
     {
        size_t length;

        length = strlen(line);
        if (line[length] == '\0')
            line[--length] = '\0';
        memcpy(array[count++], line, 1 + length);
     }
    fclose(file);

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    相关资源
    最近更新 更多