【问题标题】:How do I read in a string pass the newline character?如何在字符串中读取传递换行符?
【发布时间】:2026-01-06 05:45:01
【问题描述】:

我必须读入一个文件,例如

apple
grape
banana

并将其存储到一个字符串中,但 fgets 仅读取到换行符并停止,因此它仅在苹果中读取。

我该如何解决这个问题?或者如何将这三个单词全部存储为单独的字符串?

char* readFile(const char *fileName)
{
    FILE *inFile;
    inFile=fopen(fileName, "r");

    char **stringInFile;
    stringInFile = malloc(sizeof(char*)*50);
    char *data = fgets(stringInFile,50,inFile);
    printf("%s", data);

    fclose(inFile);

    return data;
}

顺便说一句,这都是在 C 中。

【问题讨论】:

  • 你试过了吗?你在网上找过答案吗?
  • @user3121023 这似乎很浪费......他只需要读取三个字符串并将它们连接起来。

标签: c string fgets


【解决方案1】:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char** readFile(const char *fileName);

int main(int argc, char **argv){
    char **data = readFile(argv[1]);
    int i;
    for(i=0; data[i] ; ++i){
        puts(data[i]);
        free(data[i]);
    }
    free(data);
    return 0;
}

char** readFile(const char *fileName){
    FILE *inFile;
    inFile=fopen(fileName, "r");

    char **stringInFile;
    stringInFile = calloc(50, sizeof(char*));
    char line[256];
    int i = 0;
    while(fgets(line, sizeof(line), inFile)){
        char *p = strchr(line, '\n');
        if(p)
            *p = 0;
        if(i < 50 - 1)
            stringInFile[i++] = strdup(line);
    }

    fclose(inFile);

    return stringInFile;
}

【讨论】:

    【解决方案2】:

    fgets() 每次调用只读取 一个 行,并将文件 courser 设置为下一行。如果要读取完整文件,则必须对其进行迭代。要检查您是否在最后,您可以使用 feof() 检查 EOF 标志。 结果,对我来说:

    char* readFile(const char *fileName)
    {
    FILE *inFile;
    inFile=fopen(fileName, "r");
    
    char **stringInFile;
    stringInFile = malloc(sizeof(char*)*50);
    while(!feof(inFile))
    {
      printf("%s", fgets(stringInFile,50,inFile));
    }
    
    fclose(inFile);
    
    return stringInFile;
    }
    

    而且,您不需要变量data - fgets() 第一个参数是一个字符数组,它会自动存储在哪里(例如您的程序中的Apple)。

    【讨论】:

    • 请务必注意,feof(fileptr) 只有在您实际尝试读取文件末尾之外的内容时才会为真。 fgets 将愉快地返回最后一行,包括文件末尾的换行符,但 feof 将为 false。然后您将尝试另一个fgets,它将返回NULL,因为没有更多数据要读取,结果是printf("%s", NULL);,这可能会使您的程序在段错误中崩溃或打印一些字符串,具体取决于您的C库. More info can be found here