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

时间:2017-06-20 14:36:14

标签: c fgets getline

我正在尝试用C语言阅读文本文件。文本文件是一个简单的语言文件,可以在嵌入式设备中使用,每个行的文件在代码上有 ENUM 侧。这是我文件的一个简单部分:

来自文本文件的样本:

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

ENUM:

   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,那么只需将设备屏幕上的送纸线字符打印为\&amp; n个字符。

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

1 个答案:

答案 0 :(得分:2)

  

当你从文本文件中取样时,我必须使用\ n Feed Line   我的一些人物上的角色。

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

实际上,如果系统将换行符识别为行终止符,那么根据定义,不可能在物理行中嵌入文字换行符。您尝试做的是将编码换行符作为&#34; \ n&#34;字符序列。这很好,但与嵌入换行符本身完全不同。

  

但毕竟我成功地阅读了文件。   但是,如果我尝试调用我的文本,该文本有feed line \ n,feed line   字符只是在设备屏幕上打印为\&amp; n个字符。

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

  

我已经尝试使用getline(...)方法了。我怎么能处理\ n字符   没有提高复杂性并逐行读取文件。

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