检查输入是否是C中的txt文件

标签 c if-statement input

我知道这是一个以前被问过的问题,但由于它没有真正收到答案,而且我也无法在其他任何地方找到这个问题,所以我想我会再问一次。

基本上,我有一个程序,当从标准输入传递 .txt 文件时,它会读取该文件并用 * 替换每个数字字符。 。现在我想知道是否有一种方法可以测试传递给它的文件是否是 .txt。这样做是为了确保输出结果实际上可用,如果有人将 .odt 或 .doc 传递给它,它就不起作用,我只是想阻止这一步发生。

if( file is a .txt file)
{
    run program
}
else
{
    print error message and exit
}

本质上,我正在寻找应该在 if 语句中放入的内容。感谢任何和所有的帮助。

最佳答案

如果您只是在寻找.txt扩展,这还不错。验证传递的文件名是否为 4 个字符或更长(如果不是,则文件名太短而无法具有该扩展名),然后执行 strcmp (或 stricmp 允许 *.TXT*.tXT 等,因为 Windows 对此内容不区分大小写)在文件名的最后四个字符和 ".txt" 之间。注意:在 Windows 上,有 PathFindExtension 函数可以为您完成查找文件扩展名开头的繁重工作。

如果您尝试验证内容是文本,那么这是一个更难的问题。这完全取决于您所说的“文本”的含义。没有单一的方式来表示文本;您通常可以通过检查 BOM 来轻松识别 UTF-16/UTF-32 文本(偶尔也可以识别 UTF-8 文本) ( Byte Order Mark ) 在文件的开头。但 ASCII 文本没有这样的标记(并且任意二进制数据可能巧合地具有 BOM);对于 ASCII,你会陷入启发式的困境,例如文件中的所有字节都是 < 128 (将字节解释为 unsigned char ),可能需要额外的检查来假设某些 ASCII 不可打印字符意味着“不是真正的文本”。如果它是 ASCII 超集,则所有字节值都是合法的,因此启发式方法归结为识别语言;这不是一项微不足道的任务。 libmagic 可以在 Linux 上提供帮助,但在涉及文本时它仍然会进行启发式猜测。

关于检查输入是否是C中的txt文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32571182/

相关文章:

c# - 将 Shift+1 检测为 Key.Add

c - 如何设置以 root 身份使用 execl 以用户身份启动应用程序?

c - 字符串解析的指针算法

c - 重新分配二维数组 - valgrind 错误

python - 在 Python 中选择两个时间

css - 将输入 radio 更改为大的 div 框

ios - 如何在 Swift 中调用带有二维数组参数的 C 函数?

c++ - 只返回第一个 if 语句? (C++)

javascript - 开始输入时出现提醒

android - HTML 输入 : force numeric keyboard by default but allow letters