我想将文本文件中的所有数据打印到编辑控制器中

I want to print all the data in the text file into the edit controller

我可以使用“fgets”获取文本文件字符串,然后使用“SetWindowTextA”打印一行。喜欢这个代码

FILE *p_file = fopen("Test.txt", "r");
if (p_file != NULL) {
  text = fgets(temp, sizeof(temp), p_file);
  m_Edit_load.SetWindowTextA(text);
  fclose(p_file)
}

但是我想打印出所有的行。我使用了底部的代码,但只打印了最后一行

FILE *p_file = fopen("Test.txt", "r");
if (p_file != NULL) {
  while(NULL != fgets(temp, sizeof(temp), p_file){
    m_Edit_load.SetWindowTextA(temp);
  }
  fclose(p_file);
}

如何打印出所有行?

这里的问题是,SetWindowTextA 是设置文本,而不是附加。因此,您的 window 可能以最后一行结尾。要解决这个问题,首先创建一个动态数组,追加所有字符,然后最后调用 SetWindowTextA

最直接的方法是以二进制模式打开文件,将其加载到缓冲区并通过单个 SetWindowText() 调用将其放入控件中。

根据文本文件的格式,可能需要一些额外的步骤:

  • 如果文件是 ASCII,并且代码页与其运行的系统相同,则 SetWindowTextA() 调用是可以的。
  • 如果文件是 Unicode,可以通过调用 SetWindowTextW() 将其加载到控件上 - 控件也必须是 Unicode。
  • 如果文件是 UTF-8 或 ASCII,但不是系统的代码页,则在加载到控件之前,必须使用 MultiByteToWideChar() 函数将文本转换为 Unicode。
  • 另一个可能需要的转换是 LF 到 CR-LF,如果行在控件中连接的话。您需要为此编写一些代码。

正如其他答案之一所述,问题是 SetWindowText 会覆盖文本。您的代码似乎错误地假设此函数将改为附加文本。

如果要将编辑控件设置为文件的整个文本,则必须将文件的整个文本读入内存缓冲区,并将指向该内存缓冲区的指针传递给SetWindowText.

函数fgets用于读取单行。虽然您可以使用 fgets 来解决您的问题,但没有理由限制您一次只阅读一行。因此,在一个函数调用中读取尽可能多的数据会更有效率,例如使用函数 fread 而不是 fgets.

另一个问题是您以文本模式打开文本文件,这意味着 \r\n 行结尾将被转换为 \n。但是,这不是您想要的,因为在多行编辑控件上使用 SetWindowText 时,行尾必须是 \r\n,而不是 \n。因此,您应该更改行

FILE *p_file = fopen("Test.txt", "r");

FILE *p_file = fopen("Test.txt", "rb");

为了以二进制模式打开文件。

整个代码应该是这样的:

FILE *fp = fopen( "Test.txt", "rb" );
if ( fp != NULL )
{
    char buffer[4096];
    size_t bytes_read;

    bytes_read = fread( buffer, 1, (sizeof buffer) - 1, fp );
    buffer[bytes_read] = '[=12=]';

    m_Edit_load.SetWindowTextA( buffer );

    fclose(p_file);
}

如果 4096 字节可能不足以包含整个文件,那么您可以增加缓冲区的大小。但是,你不应该增加太多,否则,有一个 stack overflow. Instead of allocating the memory buffer on the stack, you could also allocate it on the heap, by using malloc instead. Another alternative would be to use a static 缓冲区的危险,它也不会在堆栈上分配。