在 C 中从文件中读取字符串时出现问题

Problem with reading string from a file in C

提问人:Tony Reirdan 提问时间:7/2/2019 最后编辑:Tony Reirdan 更新时间:7/2/2019 访问量:68

问:

我试图寻找类似的问题,但找不到,所以我发布了这个。事情是这样的。 假设我有一个名为 text.txt 的文件。现在,该文件由 3 个整数和字符串组成,如下所示:

4 59 32 This is sentence 1
5 9 130 Grass is green
3 12 149 I need help

我还在学习 C,所以如果这是一些简单的类型问题等,我很抱歉。这就是问题所在。我不知道怎么读这个。如果字符串位于文件的开头,则也是如此,如下所示

This is sentence 1 4 59 32
Grass is green 5 9 130 
I need help 3 12 149 

如果我知道它将包含多少个单词,我就知道如何阅读它(例如,如果文件类似于姓名、姓氏、数字、数字),但是当我需要完整阅读时,我不知道。

这是来自评论的代码。然而,正如@john所指出的,它从一开始就是错误的,因为我得到了第一个字符,然后我做了 scanf(尽管如此,我已经尝试过,并且只涉及数字,即使读取第一个字符,fscanf 也会获得正确的值)。 我也在考虑一些涉及 isalpha() 和 isspace() 的 while 循环,但无济于事。

while((i = fgetc(input)) != (int)(EOF))
    {
        fscanf(inputFile, "%d %d %d", &num1, &num2, &num3);

        j=0;
        while(i != (int)('\n'))
        {
            string[j++]=(char)i;
            i = fgetc(inputFile);
        }
        string[j] = '\0';

        printf("%d %d %d %s\n",br1, br2, br3, string);
C 字符串 文件 EOF

评论

0赞 OznOg 7/2/2019
你试过了什么?
0赞 Ulrich Eckhardt 7/2/2019
参观并阅读如何提问。关于你的问题,你需要提供一个最小的可重复的例子,没有这个例子就是题外话。
0赞 Tony Reirdan 7/2/2019
@OznOg 我正在尝试这样的事情: while((i = fgetc(input)) != (int)(EOF)) { fscanf(inputFile, “%d %d %d”, &num1, &num2, &num3); j=0; while(i != (int)('\n')) { string[j++]=(char)i; i = fgetc(inputFile); } string[j] = '\0'; printf(“%d %d %d %d %s\n”,br1, br2, br3, string);所以,这里的想法是阅读这三个整数,然后逐个字符地阅读,直到我到达行的末尾。但是,这是行不通的。
0赞 john 7/2/2019
@TonyReirdan 首先是决定哪种格式。第二个显然更难,因为没有简单的方法来区分数字和单词,所以忘记它并尝试第一个。正如你所说,诀窍是先读取三个整数,然后再读取行的其余部分。但是你的代码不会这样做,它从读取一个字符开始,而不是从前三个整数开始。
0赞 Tony Reirdan 7/2/2019
@OznOg是的,对不起,我现在已经做到了。

答:

0赞 Armali 7/2/2019 #1

从一开始就是错误的,因为我得到了第一个字符,然后我做了扫描

你是对的,这是错的。没有必要仅仅为了测试 EOF 而使用行的第一个字符 - 我们可以将其留给 .
此外,无需逐个读取字符串的字符 - 可以读取以 转换规范结尾的字符串。
如果输入字符串长度不受限制,则当输入字符串需要的内存多于提供内存时,我们必须通过添加最大字段宽度来防止缓冲区溢出。例如,如果定义了 ,则最大字段宽度为 99,因为终止 null 字符需要最后一个。
因此,我们可以写例如。
fscanf()fscanf()\n%[^\n]stringchar string[100];char

    while (fscanf(input, "%d %d %d %99[^\n]", &num1, &num2, &num3, string) == 4)
        printf("%d %d %d %s\n", num1, num2, num3, string);