在C中从.txt文件阅读输入

qyyhg6bp  于 2023-06-05  发布在  其他
关注(0)|答案(2)|浏览(155)

john smith 21 VETERAN 1
我有一个.txt文件写这个。我想读这个.txt文件,把johnsmith作为变量。但我看不懂有空格的文字
编辑:我想把约翰史密斯和打印它在控制台与
printf("%s",name);我尝试了下面的代码,但没有工作.只收史密斯。

while (fscanf(file, "%s, %d %s %d", name, &age, priorityGroup, &priorityLevel) == 4)

编辑2:

0ve6wy6x

0ve6wy6x1#

对于初学C语言的人来说,这个任务并不容易。
可以有不同的方法。
我可以提出以下方法。
首先,使用标准C函数fgets从文件中读取完整记录,例如

char record[100];

fgets( record, sizeof( record ), fp );

现在让我们假设已经读取了记录。然后要输出record中的前两个单词,您可以使用标准C函数sscanf,如下面的演示程序所示。

#include <stdio.h>

int main( void )
{
    char record[] = "john smith 21 VETERAN 1\n";

    int n = 0;

    for (size_t i = 0; i < 2; i++)
    {
        const char *p = record + n;
        int m;

        sscanf( p, "%*s%n", &m );

        n += m;
    }

    printf( "\"%.*s\"\n", n, record );
}

程序输出为

"john smith"

或者你可以把这两个单词组成一串

record[n] = '\0';
printf( "\"%s\"\n", record );

或者如果你的编译器支持可变长度数组,你可以写

#include <string.h>

//...

char name[n + 1];

memcpy( name, record, n );
name[n] = '\0';

printf( "\"%s\"\n", name );

如果编译器不支持可变长度数组,那么你需要动态地分配一个数组,例如

#include <string.h>
#include <stdlib.h>

//...

char *name = malloc( n + 1 );

memcpy( name, record, n );
name[n] = '\0';

printf( "\"%s\"\n", name );

在这种情况下,当不再需要分配的内存时,不要忘记释放它

free( name );

在演示程序中,用作数组record的初始化器的字符串字面量被追加了新的行字符'\n',因为函数fgets本身可以将此字符存储在目标数组中。

ymdaylpp

ymdaylpp2#

您可以从文件中读取文本行,然后使用strtok函数根据空格分隔符将读取的文本拆分为令牌,然后将第一个和第二个名称复制到字符串数组中,然后将第一个索引和第二个索引中的值连接起来,以获得名称john smith。查看下面的代码,了解如何在C中实现这一点。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {    
    //declare the file pointer with the string you intend to read
    FILE* file = fopen("info.txt", "r");
    //make sure the file exists and is openable
    if (file == NULL) {
        printf("%s\n", "Unable to open file");
        return EXIT_FAILURE;
    }
    //initialize a character buffer to read the string in the file into
    char buffer[50];
    //read the line from the file
    fgets(buffer, sizeof(buffer), file);
    //declare a string array to hold the first two entries of the file
    //each name is assumed to have a maximum length of 30 characters
    char values[2][30];
    //declare an integer var for traversing the array
    int index = 0;
    //split the input string based on space delimiter
    char * token = strtok(buffer, " ");
    while (token != NULL && index <2) {
        //copy the token to the array
        strcpy(values[index], token);
        //reset the token
        token = strtok(NULL, " ");
        //update index for continuous iterations
        index++;
    }
    //use string concat to merge the names in the string array
    
    //declare the final string variable that will hold both names
    char final[50];
    //copy the first name to this variable
    strcpy(final, values[0]);
    //append space between the two names
    strcat(final, " ");
    //append the second name
    strcat(final, values[1]);
    printf("%s", final);
    //outputs john smith
    return 0;
}

相关问题