【问题标题】:Reading a text file line by line and saving to an array (C Language)逐行读取文本文件并保存到数组(C语言)
【发布时间】:2013-11-13 00:07:50
【问题描述】:

这是我的问题: 我目前正在为大学做一个项目。我们假设做一个程序,接收 .pbm 和 .pgm 文件作为输入,然后我们假设以某种方式处理它们。但目前主要是成功接收它们。 每个 .pbm 和 .pgm 文件的第一行都是一个“幻数”。一组字符,如 P1、P2 (...) P6。 我们的目标是接收一个 .pbm 文件作为输入,保存第一行,动态分配一个字符串,使其与它的内容一样大(例如 P6\n),这样我们就可以检测到幻数。这同样适用于所有其他行。我们基本上只是想要一种方法将每一行保存到一个数组中,使它们与它们的内容一样大。 我和我的项目伙伴都是初学者:文件处理、指针、动态内存和标题对我们来说仍然相当困难。先感谢您。

---EDIT---(忘记了代码,正如用户指出的那样)

int main(int argc, char const *argv[])
{
    readFile(argv[1], "EI_2012-13_ascii.pbm");
    return 0;
}

void readFile (const char* input_file, char* filename){
    char *line_buffer, *line;
    FILE *file_stream = NULL;

    if(!check_extension(filename, ".pbm") &&
     !check_extension(filename, ".pgm") && !check_extension(filename, ".ppm"))
        ERROR(ERR_EXT, "Invalid file extension!\n");


    file_stream = fopen(input_file, "r");
    if (file_stream == NULL)
        ERROR(ERR_EXT, "Couldn't open the file for reading");

    line_buffer = malloc(sizeof(2));
    fscanf(file_stream, "%s", line_buffer);
    //line = strchr(line_buffer, '\n');

    printf("%s\n", line_buffer);
    printf("%d\n", sizeof(line_buffer));

    fclose(file_stream);
}

使用这段代码,我们试图在它下面输出一个字符串及其大小。奇怪的是,我们一直得到相同的输出: 4. 我们需要 malloc 接收到正确的参数,即直到 '\n' 的行的大小。

【问题讨论】:

标签: c arrays string file pointers


【解决方案1】:

您可以使用Linux函数getline()逐行检测读取文件的幻数,如下所示,

void readFile (const char* input_file, char* filename){
    char *line;
    FILE *file_stream = NULL;
    ssize_t read; size_t len = 0;

    file_stream = fopen(input_file, "r");
    if (file_stream == NULL)
         ERROR(ERR_EXT, "Couldn't open the file for reading");

     while((read = getline(&line, &len, file_stream)) != 1){
        printf("%s", line);
        printf("length of line: %zu\n", read);
     }
     if (line)
        free(line);  
     fclose(file_stream);
}

【讨论】:

  • 谢谢!这个解决方案很棒,因为我在 linux 环境中工作。
  • 我猜的类型。 while 中的检查条件应该反对 -1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 2016-11-20
  • 1970-01-01
相关资源
最近更新 更多