从C中的文件中读取行和列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从C中的文件中读取行和列相关的知识,希望对你有一定的参考价值。

我试图用我的C代码读取此输入txt文件:

4 3
1.4 4.6 1
1.6 6.65 1
7.8 1.45 0
7 -2 2

并将它们分成行和列,以便我可以排序。我试过这样做,但我不断得到奇怪的数字。

所以我尝试在从文件中读取行和列后打印出行和列,输出为零。我意识到我的代码没有正确地从我的文本文件中读取数字。我尝试了不同的方法来解决无济于事的问题。任何帮助或指示将受到高度赞赏。

 #include <stdio.h>
#include <string.h>
#include <stdbool.h> //for bool

int main(){

    setvbuf(stdout, NULL,_IONBF, 0);

int c;
FILE *file;
FILE *infile;
char filename[99];
char choice;
int rows, columns;


//while(choice == 'y' || choice == 'Y'){
    printf("%s", "Enter file name: ");
    fgets(filename, 99, stdin);
    char *p = strchr(filename, '
'); // p will point to the newline in filename
    if(p) *p = 0; 
    file = fopen(filename, "r");

    if (file) {
        while ((c = getc(file)) != EOF)
            putchar(c);
        fclose(file);
    }
    else{
        puts("FILE NOT FOUND");
    }

    //read rows and columns from file
    printf("%s","
");
    fscanf(file, "%d", &rows);
    fscanf(file, "%d", &columns);

    printf("%d", rows);
    printf("%d", columns);

}

答案

Problem 1

int rows = 0;
int columns = 0;
float matrix[rows][columns];
float sumOfRows[rows];

是不正确的。

之后,matrixsumOfRows中的元素数量是固定的。如果您在程序中稍后更改rowscolumns的值,它们将不会更改。

在定义rowscolumns之前,您需要先读取matrixsumOfRows的值。

问题2

    fscanf(file, "%d", &matrix[rows][columns]);

    printf("%f",matrix[rows][columns]);

也不对。鉴于matrix的定义,使用matrix[rows][columns]是不对的。他们使用越界索引访问数组。请记住,给定一个大小为N的数组,有效指数是0N-1


这是解决问题的一种方法:

fscanf(file, "%d", &rows);     // Use %d, not %f
fscanf(file, "%d", &columns);  // Use %d, not %f

// Now define the arrays.
float matrix[rows][columns];
float sumOfRows[rows];

// Read the data of matrix
for (int i = 0; i < rows; ++i )
{
   for (int j = 0; j < columns; ++j )
   {
      fscanf(file, "%f", &matrix[i][j]);  // Use %f, not %d
   }
}
另一答案

你的问题(实际上,有两个问题)在if (file) {...块中。首先,使用循环读取文件中的所有字符。因此,在循环结束时,您也位于文件的末尾。对fscanf的任何进一步调用都会导致未定义的行为。

其次,如果文件没有打开,你打印一条消息(到错误的输出)仍然继续到fscanf部分,这肯定会导致未定义的行为。

解决方案:删除while循环并修复错误处理代码:

if(file) {
    // Nothing!
} else {
    perror(filename);
    return 1; // or return EXIT_FAILURE;
}

以上是关于从C中的文件中读取行和列的主要内容,如果未能解决你的问题,请参考以下文章

使用 bash (sed/awk) 提取 CSV 文件中的行和列?

读取特定的行和列 C++

从其他数据框行和列位置找到相应的值

Python - 如何在 Python 中从 Google 表格中读取特定范围的行和列?

如何转换由 | 分隔的顺序数据并且在 pyspark 中的行和列中没有换行符

如何从 MS ACCESS 数据库中的特定行和列中获取值?