检测C中的行尾

时间:2014-05-09 09:54:38

标签: c arrays matrix eol

这是从文件“F1.txt”

读取矩阵10x10的代码
#include <stdio.h>

int main( int argc, char ** argv ) {

    FILE * fr;
    fr = fopen("F1.txt","r");

    int i, j;
    int matrix[10][10] = {0.0}; 

    for(i = 0; i < 10; i++)
    {
        for(j = 0; j < 10; j++)
        {
            fscanf(fr, "%d",&matrix[i][j]);
            printf("%d\n", matrix[i][j]);
        }
    }

    getchar();
    return 0;
}

“F1.txt”如下所示:

12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 4 34 56 43 32 124 52 212 3
32 343 34 544 43 32 7 52 456 98

它没有问题,但输出是:

12
343
34
544
43
32
124
52
212
3
12
343
34
544
43
32
124
52
212
..........
etc....

我必须检测行尾以使我的输入与F1.txt中的输入相同

12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 4 34 56 43 32 124 52 212 3
32 343 34 544 43 32 7 52 456 98

5 个答案:

答案 0 :(得分:4)

以下列方式重写循环

for(i = 0; i < 10; i++)
{
    for(j = 0; j < 10; j++)
    {
        fscanf(fr, "%d",&matrix[i][j]);
        printf("%3d ", matrix[i][j]);
    }
    printf( "\n" );
}

答案 1 :(得分:2)

您正在正确读取数据,但您没有正确打印。您的程序会在每个字符后插入'\n',这就是您看到这么多行的原因。

像这样更改您的程序以查看您期望的输出:

for(i = 0; i < 10; i++)
{
    for(j = 0; j < 10; j++)
    {
        fscanf(fr, "%d",&matrix[i][j]);
        printf("%d ", matrix[i][j]); // <<== Replace \n with a single space
    }
    printf("\n"); // <<== Add this line
}

答案 2 :(得分:2)

或者,如果您只想格式化输入,可以在i的外部循环中编写行尾。

for(i = 0; i < 10; i++)
{
    for(j = 0; j < 10; j++)
    {
        fscanf(fr, "%d",&matrix[i][j]);
        printf("%d\t", matrix[i][j]);
    }
    printf("\n");
}

答案 3 :(得分:0)

根据您的了解,EOL通常是LF字符或CR-LF个字符的组合。在C中,它们分别由\n\r\n表示。

一种可能的解决方案是,您可以使用fgets一次读取完整的一行(fgets只会自行读取一行)。然后使用sscanfstrtok

从该字符串中读出整数

如果您知道每行中的整数数量,建议您使用sscanf

否则,如果某行可以包含任意数量的数字,那么您可以使用strtok " "(空格)作为分隔符。

您可以在此处详细了解这些功能:sscanfstrtok

答案 4 :(得分:0)

fscanf(fr, "%d",&matrix[i][j]);
printf("%d", matrix[i][j]);
if(j < 10-1)
    printf(" ");
else
    printf("\n");