从 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 序列。我会为此写一个函数。但是无论如何,您的程序都会更加复杂,因为当前版本根本无法完成它需要做的所有事情。
我正在尝试用 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 序列。我会为此写一个函数。但是无论如何,您的程序都会更加复杂,因为当前版本根本无法完成它需要做的所有事情。