如何读取文件同一行的多个字符串?
How to read multiple strings on the same row of a file?
我是 C 的新手,正在尝试学习字符串、I/O 和文件。
我正在尝试从每行有多个字符串的文件中读取字符串,如下所示:
str1 str2 str3
str4 str5 str6
str7 str8 str9
到目前为止,我已经尝试过:
scanf("%s %s %s", &str1, &str2, &str3);
但它以一种奇怪的方式读取字符串。为什么 scanf
函数不起作用?我还看到另一种方法是使用 fgets
读取缓冲区中的整行,但我对我的缓冲区管理技能不是很有信心,所以有什么方法可以使用 scanf
?
在 C 中读取行的最佳方法是先使用 fgets()
读取,然后您可以使用 sscanf()
或 strtok()
解析行以获取单词。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char line[1024];
char str1[1024], str2[1024], str3[1024];
while (fgets(line, sizeof(line), stdin) != NULL){
if (strlen(line) > 0 && line[strlen(line) - 1] != '\n') {
// or line[0] instead of strlen(line) > 0
// like chux suggested (line[0] is more efficient)
puts("The line is longer than expected");
return 1;
}
if (sscanf(line, "%s %s %s", str1, str2, str3) != 3){
// notice it wont fail if the input have more than 3 columns
puts("Error parsing, not enough columns");
return 2;
}
}
return EXIT_SUCCESS;
}
我有一个文本文件:
ho hello blah hi dsdf hihi hiho hih bleh
以下是我用来阅读它的代码。
#include <stdio.h>
int main()
{
char string1[11];
char string2[11];
char string3[11];
char string4[11];
char string5[11];
char string6[11];
char string7[11];
char string8[11];
char string9[11];
FILE * fileReader = fopen("text.txt", "r");
if(fileReader)
{
fscanf(fileReader, "%10s %10s %10s %10s %10s %10s %10s %10s %10s", string1, string2, string3, string4, string5, string6, string7, string8, string9);
printf("Found: %s %s %s %s %s %s %s %s %s\n", string1, string2, string3, string4, string5, string6, string7, string8, string9);
fclose(fileReader);
}
else
{
puts("Error opening filestream!");
}
return 0;
}
FILE *,又名流用于 C 中的 input/output。scanf() 使用默认输入流 (stdin),因此不能用于读取文件。 fscanf() 允许您将文件流指定为参数。
此外,使用 %10s 可防止 fscanf() 为每个字符串读取超过 10 个字符。如果没有 %10s,scanf() 可能会导致您的程序出现缓冲区溢出。这基本上是当它读取的数据多于 char [] 变量可以容纳的数据时,破坏了程序内存。
if(fileReader) 检查 fileReader 是否已成功打开(非零值 = true,0(又名 NULL)= false)。我本可以像 if(fileReader != NULL) 那样做,但效果是一样的。
此外,您在处理数组时不使用 & 运算符。 数组在传递给函数时退化为指针,例如 scanf(),因此通过使用 &,您传递给 scanf() 的是指针的地址,这不是您想要的。
以上代码编译时得到的结果(使用的文本文件另存为"text.txt"):
sky@sky-Lenovo-3000-N500:~$ gcc stringReader.c -o string && ./string
Found: ho hello blah hi dsdf hihi hiho hih bleh
我是 C 的新手,正在尝试学习字符串、I/O 和文件。 我正在尝试从每行有多个字符串的文件中读取字符串,如下所示:
str1 str2 str3
str4 str5 str6
str7 str8 str9
到目前为止,我已经尝试过:
scanf("%s %s %s", &str1, &str2, &str3);
但它以一种奇怪的方式读取字符串。为什么 scanf
函数不起作用?我还看到另一种方法是使用 fgets
读取缓冲区中的整行,但我对我的缓冲区管理技能不是很有信心,所以有什么方法可以使用 scanf
?
在 C 中读取行的最佳方法是先使用 fgets()
读取,然后您可以使用 sscanf()
或 strtok()
解析行以获取单词。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char line[1024];
char str1[1024], str2[1024], str3[1024];
while (fgets(line, sizeof(line), stdin) != NULL){
if (strlen(line) > 0 && line[strlen(line) - 1] != '\n') {
// or line[0] instead of strlen(line) > 0
// like chux suggested (line[0] is more efficient)
puts("The line is longer than expected");
return 1;
}
if (sscanf(line, "%s %s %s", str1, str2, str3) != 3){
// notice it wont fail if the input have more than 3 columns
puts("Error parsing, not enough columns");
return 2;
}
}
return EXIT_SUCCESS;
}
我有一个文本文件:
ho hello blah hi dsdf hihi hiho hih bleh
以下是我用来阅读它的代码。
#include <stdio.h>
int main()
{
char string1[11];
char string2[11];
char string3[11];
char string4[11];
char string5[11];
char string6[11];
char string7[11];
char string8[11];
char string9[11];
FILE * fileReader = fopen("text.txt", "r");
if(fileReader)
{
fscanf(fileReader, "%10s %10s %10s %10s %10s %10s %10s %10s %10s", string1, string2, string3, string4, string5, string6, string7, string8, string9);
printf("Found: %s %s %s %s %s %s %s %s %s\n", string1, string2, string3, string4, string5, string6, string7, string8, string9);
fclose(fileReader);
}
else
{
puts("Error opening filestream!");
}
return 0;
}
FILE *,又名流用于 C 中的 input/output。scanf() 使用默认输入流 (stdin),因此不能用于读取文件。 fscanf() 允许您将文件流指定为参数。
此外,使用 %10s 可防止 fscanf() 为每个字符串读取超过 10 个字符。如果没有 %10s,scanf() 可能会导致您的程序出现缓冲区溢出。这基本上是当它读取的数据多于 char [] 变量可以容纳的数据时,破坏了程序内存。
if(fileReader) 检查 fileReader 是否已成功打开(非零值 = true,0(又名 NULL)= false)。我本可以像 if(fileReader != NULL) 那样做,但效果是一样的。
此外,您在处理数组时不使用 & 运算符。 数组在传递给函数时退化为指针,例如 scanf(),因此通过使用 &,您传递给 scanf() 的是指针的地址,这不是您想要的。
以上代码编译时得到的结果(使用的文本文件另存为"text.txt"):
sky@sky-Lenovo-3000-N500:~$ gcc stringReader.c -o string && ./string
Found: ho hello blah hi dsdf hihi hiho hih bleh