2017-02-12 20 views
0

我一直在用这一段时间撞击墙壁,我只是试图制作一个简单的应用程序来读出文件的内容。下面是一些代码:std :: wcout在一定数量的字符后将不会打印

errno_t error; 
if ((error = fopen_s(&f, file, "r")) == 0) { 
    while (true) { 
     std::wcout << std::endl << "NEW RUN" << std::endl; 
     wchar_t content[4096]; 
     if (fgetswc(content, 4096, f) == 4096) { 
      std::wcout << content; 
      std::wcout.flush(); 
     } 
     else { 
      std::wcout << content; 
      std::wcout.flush(); 
      break; 
     } 
    } 
    fclose(f); 
    std::wcout << "PLEASE PRINT THIS NOW"; 
    system("pause"); 
    return 0; 
} 

而定制fgetswc功能:

int fgetswc(wchar_t buffer[], int count, FILE * f) { 
    for (int i = 0; i < count; i = i + 1) { 
     wchar_t c = fgetwc(f); 
     if (c != WEOF) { 
      buffer[i] = c; 
     } else { 
      return i; 
     } 
    } 
    return count; 
} 

它读取第一个4096个字节出来的文件,但随后后续std::wcout调用不会打印到控制台我有。它读取文件的其余部分并成功结束,因为我可以看到使用断点和调试器。每次迭代都会填满content。我也尝试加入调试语句,但是即使那些不打印。我只是做错了什么?据我所知,我的文件中没有特殊字符,它只是一个日志文件。

回答

1
std::wcout << content; 

这实际上是调用std::wostream::operator<<(const wchar_t *)。它不知道content不是一个以''结尾的字符串。事实上,它不可能知道它在第一种情况下的有效长度为4096,在第二种情况下它的有效数量较少(不保存返回值fgetswc)。

+0

我不知道'std :: wcout'需要被换行符终止,因为我可以执行'std :: wcout <<“great”;'没有任何'std :: endl'。我想它只是穿过char数组,然后继续。我仍然不明白为什么它不会继续,因为我知道第一次穿过肯定有4096个字符。 – duper51

+1

@ duper51语法'“伟大的''产生一个6元素的字符数组,其中包含一个终止NUL。你如何期待'std :: wcout <<'知道在哪里停止打印呢?如果你传递一个'wstring',那么它有一个已知的长度,如果你传递一个'wchar_t *'它取决于找到一个NUL字符。 – ephemient

+0

啊,有趣。 – duper51