gpt4 book ai didi

c - while循环只读取文件的第一行

转载 作者:行者123 更新时间:2023-11-30 19:03:15 24 4
gpt4 key购买 nike

欢迎,我的 while 循环有问题。它只读取 file.txt 中的第一行。在添加通过 strtok_r 分割行的功能之前,我的应用程序无法正常工作。这个 while 循环的目的是从文件中读取所有行并用“|”分割每一行这些部分添加到适当的选项卡中。我应该怎么办?这是我的代码:

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

struct movie {
char title[100];
int year;
char genre[100];
};

int i = 0;
struct movie *movies[50];



int porownaj(struct movie* first, struct movie* second)
{
if(first->year==second->year){
if(first->title>second->title){
return 1;
}
if(first->title<second->title){
return -1;
}
if(first->title==second->title){
if(first->genre>second->genre){
return 1;
}
if(first->genre<second->genre){
return -1;
}
if(first->genre==second->genre){
return 0;
}
}
}
if(first->year>second->year){
return 1;
}
if(first->year<second->year){
return -1;
}

if(first->title==second->title){
if(first->year>second->year){
return 1;
}
if(first->year<second->year){
return -1;
}
if(first->year==second->year){
if(first->genre>second->genre){
return 1;
}
if(first->genre<second->genre){
return -1;
}
if(first->genre==second->genre){
return 0;
}
}
}
if(first->title>second->title){
return 1;
}
if(first->title<second->title){
return -1;
}

if(first->genre==second->genre){
if(first->year>second->year){
return 1;
}
if(first->year<second->year){
return -1;
}
if(first->year==second->year){
if(first->title>second->title){
return 1;
}
if(first->title<second->title){
return -1;
}
if(first->title==second->title){
return 0;
}
}
}
if(first->genre>second->genre){
return 1;
}
if(first->genre<second->genre){
return -1;
}

}


void zamien(struct movie* movies[50], int x, int y)
{
struct movie* tmpMovie = movies[x];
movies[x] = movies[y];
movies[y] = tmpMovie;
}

int main()
{

struct movie *movies[50];
do
{
printf("\n");
printf("Projekt nr 6 \n");
printf("\n");
printf("\b MENU GLOWNE \n");
printf("|-----------------| \n");
printf("[1]Baza filmow \n");
printf("[2]Dodaj film \n");
printf("[3]Zakoncz Program \n");
printf("|-----------------| \n");

char znak;

printf("Wybierz opcje z menu: ");
scanf("%s", &znak);

system("cls");

switch (znak)
{
case '1':
system("cls");
printf("Wybrales opcje BAZA FILMOW \n");
printf("TYTUL | ROK | GATUNEK\n");
printf("----------------------\n");

FILE *baza;
if ((baza = fopen("movies.txt", "r")) == NULL)
{
system("cls");
printf("Blad otwarcia pliku\n");
exit(1);
}

char tekst[512];

char *title = NULL;
char *year = NULL;
char *genre = NULL;

char *buffer = NULL;
int x = 0;

while (fgets(tekst, 512, baza) != NULL)
{
printf("%s", tekst);

title = strtok_r(tekst, "|", &buffer);
assert(title != NULL);
strcpy(movies[x]->title, title);

year = strtok_r(NULL, "|", &buffer);
assert(year != NULL);
movies[x]->year = atoi(year);

genre = strtok_r(NULL, "|", &buffer);
assert(genre != NULL);
strcpy(movies[x]->genre, genre);

x++;


}fclose(baza);


do
{
printf("\n[1]Sortuj wg. tytulu");
printf("\n[2]Sortuj wg. roku produkcji");
printf("\n[3]Sortuj wg. gatunku filmu");
printf("\n[4]Wroc do glownego menu\n");
printf("|-----------------|\n");

char click;

printf("\nWybierz opcje: ");

scanf("%s", &click);

switch (click)
{
case '1':
system("cls");
printf("Sorotowanie wg. tytulu");
/*
for(int i=0;i<10-1;i++){
for(int j=0;j<10-i-1;j++){
if(porownaj(&title[j],&title[j+1])>0){
zamien(&title[j],&title[j+1]);
}
}
}
for(int i=0;i<10;i++){
printf("(%d, %d)", title[i].x, );
}
*/
break;
case '2':
system("cls");
printf("Sorotowanie wg. roku produkcji");
/*
for(int i=0;i<10-1;i++){
for(int j=0;j<10-i-1;j++){
if(porownaj(&year[j],&year[j+1])>0){
zamien(&year[j],&year[j+1]);
}
}
}
for(int i=0;i<10;i++){
printf("(%d, %d)", year[i].x, );
}
*/
break;
case '3':
system("cls");
printf("Sorotowanie wg. gatunku filmu");

break;
case '4':
system("cls");
return main();
default:
system("cls");
printf("Nie ma takiej opcji. Program sie wylaczy!");
return 0;
}
} while (1);

case '2':
system("cls");
printf("Wybrales opcje DODAJ FILM \n");

movies[i] = malloc(sizeof(movie));

printf("Podaj nazwe filmu: ");
while ((getchar()) != '\n');
gets(movies[i]->title);

printf("Podaj rok produkcji: ");
scanf("%d", &(movies[i]->year));

printf("Podaj gatunek filmu: ");
while ((getchar()) != '\n');

gets(movies[i]->genre);

fflush(stdin);

FILE *plik = fopen("movies.txt", "a+");
fprintf(plik, "%s | %d | %s \n", movies[i]->title, movies[i]->year, movies[i]->genre);
fclose(plik);
i++;
printf("Zapisane..");
continue;
case '3':
system("cls");
printf("ZAKONCZ PROGRAM \n");
return 0;
default:
printf("Nie ma takiej opcji! \n");
return main();
}
}while (1);

return (0);
}

电影.txt:

Title | 1234 | Scifi
Title_2 | 4321 | SciFI

最佳答案

我敢打赌,每一行都打印有 printf("%s", tekst);

但是您忘记了 strtok 并没有复制字符串。因此(如果您以相反的方式固定了分配),您仍然将指针分配给所有电影的同一个 tekst 变量。相反,分配内存并复制字符串:

    title   = strtok_r(tekst, "|", &buffer);
movies[x]->title= malloc(strlen(title)+1);
strcpy(movies[x]->title, title);

其他字符串变量也是如此。

关于c - while循环只读取文件的第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54292186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com