- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
读取文件然后将字符串与该文件中的内容进行比较的最佳方法是什么?几天来我一直在努力解决这个问题,但我只是不知道该怎么做。我将不胜感激一些帮助。
最佳答案
您的问题概括地概括了从文件中读取字符串,并与另一个字符串进行字符串比较。要从您的文件中读取,您必须首先打开文件进行读取。对于从文件中读取文本,您在 C 中的正常选择是 fopen
打开流并将返回分配给 FILE
可与标准库中的流读取函数集合一起使用的指针。 (例如 fgetc
、 fgets
、 fscanf
、 getline
等。)
你的工作是打开一个文件,验证它是否打开,从文件中读取所需的信息,然后关闭文件。为此,您需要准备一个具有足够空间的缓冲区(字符数组或分配的内存块)来保存从文件中读取的信息(+1 char
用于 nul 终止字符)。如果没有 nul 终止字符,则您有一个字符数组而不是有效字符串)一个简短的示例可能是:
char buf[256] = {0}; /* char array to hold 255 chars + nul-terminating char */
FILE *fp = NULL; /* FILE pointer to hold return of fopen */
fp = fopen (filename, "r"); /* open file for reading */
if (fp == NULL) { /* if not open throw error */
fprintf (stderr, "error: file open failed 'filename'.\n");
exit (EXIT_FAILURE);
}
fscanf
读取第一个单词。进入
buf
.
fscanf
返回与给定格式说明符匹配的成功转换次数。将字段宽度选项与格式说明符一起使用,以确保您读取的内容不超过缓冲区将容纳的内容(例如
"%255s"
),为最后的 nul 终止字符节省空间。使用
fscanf
的返回值验证您的阅读:
if (fscanf (fp, "%255s", buf) != 1) {
fprintf (stderr, "error: fscanf read failure from 'filename'.\n");
exit (EXIT_FAILURE);
}
fscanf
格式说明符,(例如
"%255[...]"
,其中字符类
[...]
描述了匹配所需信息的表达式)或使用面向行的流函数之一(
fgets
或
getline
)从文件到
buf
然后解析
buf
根据文件中的需要。例如,如果文件中的第一行包含用逗号分隔的文本:
The quick brown fox, jumps over the lazy dog.
char str[256] = {0}; /* string to hold chars parsed from buf */
if (fgets (buf, 256, fp) == NULL) {
fprintf (stderr, "error: fgets read failure from 'filename'.\n");
exit (EXIT_FAILURE);
}
if (sscanf (buf, "%[^,]", str) != 1) {
fprintf (stderr, "error: sscanf no conversion made.\n");
exit (EXIT_FAILURE);
}
strcmp
.如果
strcmp
比较返回,则两个字符串相等是
0
.您可以像这样实现测试:
if (strcmp (str, teststr) == 0) /* test if strings are equal */
printf ("\n string : %s\n teststr : %s EQUAL\n", str, teststr);
else
printf ("\n string : %s\n teststr : %s DIFFER\n", str, teststr);
strcmp
执行测试并打印从文件和 teststr 读取的字符串以及字符串是 EQUAL 还是 DIFFER。
ternary
运算符,如果没有给出文件名,将使用默认文件名
data.txt
--
stdin
可以替换为
"data.txt"
以默认从
stdin
读取):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char **argv) {
char buf[256] = {0}; /* char array to hold 255 chars + null-terminating char */
char str[256] = {0}; /* string to hold chars parsed from buf */
char *teststr = "The quick brown fox"; /* string literal for comparison */
FILE *fp = NULL; /* FILE pointer to hold return of fopen */
fp = fopen (argc > 1 ? argv[1] : "data.txt", "r"); /* open file for reading */
if (fp == NULL) { /* if not open throw error */
fprintf (stderr, "error: file open failed 'filename'.\n");
exit (EXIT_FAILURE);
}
if (fgets (buf, 256, fp) == NULL) { /* read 1 line from file */
fprintf (stderr, "error: fgets read failure from 'filename'.\n");
exit (EXIT_FAILURE);
}
fclose (fp); /* close file when reading complete */
if (sscanf (buf, "%[^,]", str) != 1) { /* parse up to ',' into str */
fprintf (stderr, "error: sscanf no conversion made.\n");
exit (EXIT_FAILURE);
}
if (strcmp (str, teststr) == 0) /* test if strings are equal */
printf ("\n string : %s\n teststr : %s EQUAL\n", str, teststr);
else
printf ("\n string : %s\n teststr : %s DIFFER\n", str, teststr);
return 0;
}
$ cat dat/qbfcomma.txt
The quick brown fox, jumps over the lazy dog.
$ ./bin/fgets_strcmp dat/qbfcomma.txt
string : The quick brown fox
teststr : The quick brown fox EQUAL
fscanf
使用格式说明符
"%255[^,]"
将相同的信息读入
buf
然后简单测试
buf
反对
teststr
无需将行解析为
str
使用
sscanf
.但重要的是要注意,通常的方法是使用面向行的(一次读取一行),然后从代码中的行解析所需的信息。这将避免使用
fscanf
引起的许多陷阱。或者当试图将所有模式匹配硬塞到
fscanf
中时格式说明符。它还允许从缓冲区解析所需信息的其他方法(例如使用指针算法等)。
关于c - 读取文件然后将字符串与该文件中的内容进行比较的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33990151/
如何使用 SPListCollection.Add(String, String, String, String, Int32, String, SPListTemplate.QuickLaunchO
我刚刚开始使用 C++ 并且对 C# 有一些经验,所以我有一些一般的编程经验。然而,似乎我马上就被击落了。我试过在谷歌上寻找,以免浪费任何人的时间,但没有结果。 int main(int argc,
这个问题已经有答案了: In Java 8 how do I transform a Map to another Map using a lambda? (8 个回答) Convert a Map>
我正在使用 node + typescript 和集成的 swagger 进行 API 调用。我 Swagger 提出以下要求 http://localhost:3033/employees/sear
我是 C++ 容器模板的新手。我收集了一些记录。每条记录都有一个唯一的名称,以及一个字段/值对列表。将按名称访问记录。字段/值对的顺序很重要。因此我设计如下: typedef string
我需要这两种方法,但j2me没有,我找到了一个replaceall();但这是 replaceall(string,string,string); 第二个方法是SringBuffer但在j2me中它没
If string is an alias of String in the .net framework为什么会发生这种情况,我应该如何解释它: type JustAString = string
我有两个列表(或字符串):一个大,另一个小。 我想检查较大的(A)是否包含小的(B)。 我的期望如下: 案例 1. B 是 A 的子集 A = [1,2,3] B = [1,2] contains(A
我有一个似乎无法解决的小问题。 这里...我有一个像这样创建的输入... var input = $(''); 如果我这样做......一切都很好 $(this).append(input); 如果我
我有以下代码片段 string[] lines = objects.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.No
这可能真的很简单,但我已经坚持了一段时间了。 我正在尝试输出一个字符串,然后输出一个带有两位小数的 double ,后跟另一个字符串,这是我的代码。 System.out.printf("成本:%.2
以下是 Cloud Firestore 列表查询中的示例之一 citiesRef.where("state", ">=", "CA").where("state", "= 字符串,我们在Stack O
我正在尝试检查一个字符串是否包含在另一个字符串中。后面的代码非常简单。我怎样才能在 jquery 中做到这一点? function deleteRow(locName, locID) { if
这个问题在这里已经有了答案: How to implement big int in C++ (14 个答案) 关闭 9 年前。 我有 2 个字符串,都只包含数字。这些数字大于 uint64_t 的
我有一个带有自定义转换器的 Dozer 映射: com.xyz.Customer com.xyz.CustomerDAO customerName
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 6 年前。 我想了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是
我已阅读 this问题和其他一些问题。但它们与我的问题有些无关 对于 UILabel 如果你不指定 ? 或 ! 你会得到这样的错误: @IBOutlet property has non-option
这两种方法中哪一种在理论上更快,为什么? (指向字符串的指针必须是常量。) destination[count] 和 *destination++ 之间的确切区别是什么? destination[co
This question already has answers here: Closed 11 years ago. Possible Duplicates: Is String.Format a
我有一个Stream一个文件的,现在我想将相同的单词组合成 Map这很重要,这个词在 Stream 中出现的频率. 我知道我必须使用 collect(Collectors.groupingBy(..)
我是一名优秀的程序员,十分优秀!