csv 在使用最基本的情况下,C - fgets()会随机跳过行

eulz3vhy  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(125)

在你删除它之前,我还没有在任何线程中看到过这种情况。我见过有人想跳过行,但它失败了,或者如果有用户输入,它就会失败(这是由于stdlibc中奇怪的输入缓冲区.但不是fgets完全不工作的情况)
所以,我需要帮助,或者有人告诉我,代码的工作,我需要重新安装我的PC上的一切或东西。
一开始,我只是想快速编写一个CSV -> 2D float数组程序在C中.只是因为它会更整洁,然后手动输入一个数组在main.所以,试图寻找已经制作的代码.找不到它.试图使它自己从头开始.应该不会太糟糕,我想.我已经做过类似的事情.
但都不管用我试过了。
我最初尝试将整个文件fread放入一个char *数组中,但也没有成功。
当我使用%d打印时,我得到了整个数组(除了换行符,即字符代码10,即使在二进制模式下阅读时也没有出现),我需要在char数组中使用'\n',以将split("\n")放入不同的行,但嘿,我想这就是生活)
为了进一步增加我的困惑,当我使用%c%s打印时,我只得到了最后一行。
所以看到fread不起作用,我又试了一次,用了fgets。用了很多代码,直到我把它简化到最基本的情况,它仍然不起作用。
这是一个非常奇怪的问题。要么我错过了一些东西,我太累了,看不到它,或者C编译器更新了一个错误。在网上寻找并尝试了几个小时后,我没有找到关于这个的任何帖子。这很奇怪,因为fgets曾经在以前的项目上工作。我尝试重新启动我的PC,甚至编译Linux和Windows。两者都不起作用。
这里有一个CSV文件的内容。

2D_data.csv

0.1,0.2,0.3
1.1,2.2,3.3

字符串
这是密码

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

void readCSV(char *filename, int lineSize)
{
    FILE *filePointer = fopen(filename, "rb");
    char line[lineSize];

    fgets(line, lineSize, filePointer);
    printf("%s|\n", line);
}

void main()
{
    printf("\n\n------------START OF PROGRAM------------\n\n");
    readCSV("2D_data.csv", 128);
}


我得到输出:

1.1,2.2,3.3|


当它应该是文件的第一行时,

0.1,0.2,0.3|

0sgqnhkj

0sgqnhkj1#

解决方法:代码没有问题
这是因为我想安全,并从Excel创建了一个CSV文件,并保存为CSV。然而,我missclicked Mac CSV选项,而不是Windows CSV选项。
因此,当在Windows或Linux上编译时,换行符是不同的字符,不会被捕获。
故事的寓意:下次用文本编辑器手动编写CSV。

6jygbczu

6jygbczu2#

嗯,我觉得这是因为lineSize > 1 line..
fgets不是应该在换行符处停止吗?
新评论:在Linux中创建的文件,在linux(Windows Ubuntu子系统)中编译和运行的代码。这是以前的代码,我只是没有进一步剥离它。

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

typedef struct
{
    int size;
    char *string;
} Line;

typedef struct
{
    Line *LineArray;
    int hor; // number of element horizontally (m)
    int ver; // number of element vertically;
    float **data_matrix;
} CSV;

CSV *readCSV(char *filename, int lineSize)
{

    CSV *csv = malloc(sizeof(CSV));
    csv->hor = csv->ver = 0;


    FILE *filePointer = fopen(filename, "rb");
    char line[lineSize];


    while (fgets(line, lineSize, filePointer) != NULL)
    {
        printf("%s",line);
    }
    return csv;
}

void main()
{
    printf("\n\n------------START OF PROGRAM------------\n\n");
    readCSV("data.csv",128);
}

字符串
csv(在Linux中创建)

0.1,0.2,0.3,0.4,0.5
1.1,1.2,1.3,1.4,1.5
2.1,2.2,2.3,2.4,2.5
3.1,3.2,3.3
4.1,4.2


输出(在Linux中编译和运行)

------------START OF PROGRAM------------

0.1,0.2,0.3,0.4,0.5
1.1,1.2,1.3,1.4,1.5
2.1,2.2,2.3,2.4,2.5
3.1,3.2,3.3
4.1,4.2


但是对于在Windows中创建的文件,它仍然不能工作。除了“Windows坏”还有什么解决方案吗?我不想每次做C代码时都使用我的Linux子系统。
新编辑:如果csv是在Linux中创建的,那么在windows中运行时,代码确实可以工作
最后编辑:这是由于一个mac的CSV编码。看到我的其他答案。谢谢大家

相关问题