从 C 中的文本文件中读取 \n 作为真正的 Feed Line 字符

Reading \n as really Feed Line character from text file in C

我正在尝试用 C 读取文本文件。文本文件是一种可在嵌入式设备中运行的简单语言文件,文件的 EACH LINE 有一个 代码端的 ENUM。这是我的文件的一个简单部分:

来自文本文件的样本:

 OPERATION SUCCESS!
 OPERATION FAILED!\nRETRY COUNT : %d

枚举:

   typedef enum
   {
    ...
           MESSAGE_VALID_OP,
           MESSAGE_INVALID_OP_WITH_RETRY_COUNT
    ...
   }

加载字符串:

typedef struct
{
    char *str;
} Message;

int iTotalMessageCount = 1012;

void vLoadLanguageStrings()
{
    FILE *xStringList;
    char * tmp_line_message[256];
    size_t len = 0;
    ssize_t read;
    int message_index = 0;

    xStringList = fopen("/home/change/strings.bin", "r");

    if (xStringList == NULL)
        exit(EXIT_FAILURE);

    mMessages = (Message *) malloc(iTotalMessageCount * sizeof(Message));

    while ((read = fgets(tmp_line_message, 256, xStringList)) != -1 && message_index < iTotalMessageCount)
        {
            mMessages[message_index].str = (char *) malloc(strlen(tmp_line_message));
            memcpy(mMessages[message_index].str, tmp_line_message, strlen(tmp_line_message) -1);
            message_index++;
    }

    fclose(xStringList);
}

正如您在文本文件示例中看到的那样,我必须在某些行中使用 \n Feed Line 字符。毕竟,我成功读取了文件。但是,如果我尝试调用具有提要线 \n 的文本,则提要行字符只是作为 \ & n 字符打印在设备屏幕上。

我已经尝试使用 getline(...) 方法。如何在不增加复杂性的情况下处理 \n 字符并逐行读取文件。

As you se in the Sample from text file i have to use \n Feed Line character on some of my lines.

不,我没看到。或者至少,我没看到你这样做。双字符序列 \n 主要对 C 编译器 很重要;它在数据文件中没有固有的特殊意义,无论这些文件是否被 C 程序使用。

确实,如果系统将换行符识别为换行符,那么根据定义,不可能在物理行中嵌入文字换行符。看起来您正在尝试做的是 encode 换行符作为“\n”字符序列。很好,但这与嵌入换行符本身完全不同。

But after all, i read file successfuly. But if i try to call my text which has feed line \n, feed line character just printed on device screen as \ & n characters.

当然可以。这些是您读入的字符( 不是 换行符),因此如果您将它们写回,则可以重现它们。如果您通过该字符序列对换行符进行编码,那么您的程序必须 de 对该序列进行编码,如果您希望它在其位置输出文字换行符。

I already try with getline(...) method. How can i handle \n character without raising the complexity and read file line by line.

您需要处理读取的每一行以解码其中的 \n 序列。我会为此写一个函数。但是无论如何,您的程序都会更加复杂,因为当前版本根本无法完成它需要做的所有事情。